cataiin Posted September 15, 2013 Share Posted September 15, 2013 I have this: $txt = file_get_contents("http://example?a=".$text); $file = "texts/".md5($text).".txt"; file_put_contents($file, $txt, FILE_APPEND); and everything is okay. Except when I access the file again, $file values are doubled. So I try to add if(!file_exists($file)): $txt = file_get_contents("http://example?a=".$text); $file = "texts/".md5($text).".txt"; if(!file_exists($file)) { file_put_contents($file, $txt, FILE_APPEND); } but that does not work, now FILE_APPEND containing only the first $txt values, not all. I hope you understand. Thanks. Quote Link to comment Share on other sites More sharing options...
jcbones Posted September 15, 2013 Share Posted September 15, 2013 Are you running this in a loop? What you are stating would only make sense if you are running in a loop. Using "if no file exists" with a FILE_APPEND doesn't really make any sense. Since you are creating the file if it doesn't exist, there is nothing to append. That is why you only have 1 record. Perhaps showing a little more code for context, we can help you get it sorted. Quote Link to comment Share on other sites More sharing options...
darkfreaks Posted September 15, 2013 Share Posted September 15, 2013 sounds like the file is being overwritten. have you tried LOCK_EX???? file_put_contents($file, $txt, FILE_APPEND | LOCK_EX); Quote Link to comment Share on other sites More sharing options...
DFulg Posted September 15, 2013 Share Posted September 15, 2013 I believe jcbones nailed the issue on the head, the conditional statement when checking if the file exists is incorrect, and really is not needed here since file_put_contents along with the FILE_APPEND flag already checks if the file exists, and appends the data instead of overwriting if it does. The LOCK_EX flag is more of a precautionary flag and should not fix the issue here, however it should be used if you are expecting heavy traffic in that file. I also don't quite understand the hashing logic here, and as jcbones already stated, your code is most likely in a loop and seeing all of the relevant code will help us pinpoint the problem. Quote Link to comment Share on other sites More sharing options...
cataiin Posted September 15, 2013 Author Share Posted September 15, 2013 (edited) $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vitae tortor odio. Proin ac enim a orci consectetur venenatis. Nunc metus nunc, convallis eget tincidunt sit amet, suscipit in urna. Maecenas imperdiet vestibulum malesuada. Nulla quis pharetra neque. Nunc a erat interdum, dictum metus in, dignissim orci."; $text_split = str_split($text, 25); foreach($text_split as $texts) { $text_ok = urlencode($texts); if(!@file_get_contents("http://example.org/?q=".$text_ok)) { echo "Error."; } else { $txt = file_get_contents("http://example.org/?q=".$text_ok); $file = "texts/".md5($text).".txt"; file_put_contents($file, $txt, FILE_APPEND); } } Thanks for replies. I already tried with LOCK_EX. Same result. Edited September 15, 2013 by cataiin Quote Link to comment Share on other sites More sharing options...
jcbones Posted September 15, 2013 Share Posted September 15, 2013 The reason you are getting duplicates is that the URI in the file_get_contents() is returning the same text. Thereby duplicating it. To verify this, add a little debugging. echo $text_ok . ' = ' . $txt . '<br />'; Quote Link to comment Share on other sites More sharing options...
cataiin Posted September 15, 2013 Author Share Posted September 15, 2013 (edited) Is this better: $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vitae tortor odio. Proin ac enim a orci consectetur venenatis. Nunc metus nunc, convallis eget tincidunt sit amet, suscipit in urna. Maecenas imperdiet vestibulum malesuada. Nulla quis pharetra neque. Nunc a erat interdum, dictum metus in, dignissim orci."; $text_split = str_split($text, 25); $number = 1; foreach($text_split as $texts) { $text_ok = urlencode($texts); if(!@file_get_contents("http://example.org/?q=".$text_ok)) { echo "Error."; } else { $txt = file_get_contents("http://example.org/?q=".$text_ok); $file = "texts/".md5($text)."-".$number.".txt"; file_put_contents($file, $txt); } $number++; } ? But how to combine the results now? Edited September 15, 2013 by cataiin Quote Link to comment Share on other sites More sharing options...
jcbones Posted September 15, 2013 Share Posted September 15, 2013 First I would check if the files are indeed returning the same values. Then decide the best course of action from there. After all, it is better to make an informed decision, than to throw things at it in an attempt to get it to "work". $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vitae tortor odio. Proin ac enim a orci consectetur venenatis. Nunc metus nunc, convallis eget tincidunt sit amet, suscipit in urna. Maecenas imperdiet vestibulum malesuada. Nulla quis pharetra neque. Nunc a erat interdum, dictum metus in, dignissim orci."; $text_split = str_split($text, 25); foreach($text_split as $texts) { $text_ok = urlencode($texts); if(!@file_get_contents("http://example.org/?q=".$text_ok)) { echo "Error."; } else { $txt = file_get_contents("http://example.org/?q=".$text_ok); $file = "texts/".md5($text).".txt"; file_put_contents($file, $txt); } echo $text_ok . ' = ' . $txt . '<br />'; } Quote Link to comment Share on other sites More sharing options...
cataiin Posted September 15, 2013 Author Share Posted September 15, 2013 Look, for example this code: $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi vitae tortor odio. Proin ac enim a orci consectetur venenatis. Nunc metus nunc, convallis eget tincidunt sit amet, suscipit in urna. Maecenas imperdiet vestibulum malesuada. Nulla quis pharetra neque. Nunc a erat interdum, dictum metus in, dignissim orci."; $text_split = str_split($text, 25); $number = 1; foreach($text_split as $texts) { $text_ok = urlencode($texts); if(!@file_get_contents("http://example.org/?q=".$text_ok)) { echo "Error."; } else { $txt = file_get_contents("http://example.org/?q=".$text_ok); $file = "texts/".md5($text)."-".$number.".txt"; file_put_contents($file, $txt); } $number++; } Create texts/eebb32402578e0ce1297b8c2bbac056e-1.txt, texts/eebb32402578e0ce1297b8c2bbac056e-2.txt etc. Different files with different content. Everything is correct. I only need them "combined" into a single file and I thought to appeal to FILE_APPEND for it because I thought it was easier and escape $number too. And first code do this, makes eebb32402578e0ce1297b8c2bbac056e.txt with content from all files with the same name. But it doubles each time. Sorry but my english is so bad. Hope you understand. Quote Link to comment Share on other sites More sharing options...
jcbones Posted September 15, 2013 Share Posted September 15, 2013 I understand what you are saying, just not why you are trying to do it. What I would do (if I wanted to do this): Use a database. If that wasn't an option: 1. write the files. file_put_contents() 2. loop through the files. glob() file_get_contents() 3. see if the contents matched. strcmp() 4. write the results to a file combining the results. file_put_contents() Quote Link to comment Share on other sites More sharing options...
DavidAM Posted September 16, 2013 Share Posted September 16, 2013 Part of the problem with obfuscated questions is that we can't really tell what you are trying to do, and it makes it difficult to understand the problem and provide an answer. I hope you have permission to scrape whatever site you are scraping and you are not violating their Terms of Service. If you are, please ignore my answer below. The problem is this line: $file = "texts/".md5($text)."-".$number.".txt";You are using THE ORIGINAL TEXT STRING FOR EVERY FILE in the md5() call. I suspect you meant to use $txt there. Which would give you a different file for each result. Also, take that first call to file_get_contents() out of there. You are wasting your resources and resources on the other site: if (! ($txt = file_get_contents(...))) { echo 'Error'; } else { # Process $txt } Quote Link to comment Share on other sites More sharing options...
cataiin Posted September 16, 2013 Author Share Posted September 16, 2013 Thanks for replies. I'm allowed to extract data from the site, only $text must be limited to 25 characters.Following code does exactly what I want: $txt = file_get_contents("http://example.org/text=".$text_ok); $file = "texts/parts/".md5($text)."-".$number.".txt"; $file_final = "texts/".md5($text).".txt"; if(!file_exists($file)) { file_put_contents($file, $txt); file_put_contents($file_final, $txt, FILE_APPEND); } I do not know how accurate it is but it's the only solution I've found it... Is no problem with: $file = "texts/".md5($text)."-".$number.".txt"; Result is always different and content also. I hope I get it right! Quote Link to comment Share on other sites More sharing options...
priyankagound Posted September 16, 2013 Share Posted September 16, 2013 This one is the code which may help you. if (file_exists($myFile)) {$fh = fopen($myFile, 'a');fwrite($fh, $message."\n");} else {$fh = fopen($myFile, 'w');fwrite($fh, $message."\n");}fclose($fh); The append mode already does just what you describe. Quote Link to comment Share on other sites More sharing options...
cataiin Posted September 16, 2013 Author Share Posted September 16, 2013 (edited) No, it does not help me. I have to use file_put_contents. Otherwise, the code does not work. Edited September 16, 2013 by cataiin Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.