Я добавляю в файл status.txt единицу, если скрипт работает, или 0 если не работает. PHP: <? if (!file_exists("status.txt")) file_put_contents("status.txt", 0);//Create status.txt with value "0" //Read "status.txt" $status = file("status.txt"); print_r($status); if($status[0]!=1) start(); else{echo "already working...";} function start() { file_put_contents("status.txt", 1);//Start work sleep(10); file_put_contents("status.txt", 0);//End work } По идее, если в файле записано 1 то функция start() не должна происходить и должен сработать echo, но этого не происходит, если запустить один и тот же скрипт через 3 секунды, всегда попадает в функцию start(). Но файл status.txt действительно содержит в себе 1 когда скрипт запущен. Я убеждаюсь, что файл содержит единицу, запускаю в новой вкладке этот же скрипт (в то время, как он уже запущен) и вуаля - опять функция start запускается. В чем моя ошибка?
Скорее всего в том, что $status[0] - строка, а ты сравниваешь с int. Но я не уверен в этом, потому что хз как пых делает приведение типов при сравнении и делает ли вообще.
<? if (!file_exists("status.txt")) file_put_contents("status.txt", 0);//Create status.txt with value "0" //Read "status.txt" $status = file("status.txt"); print_r($status); if(abs(trim($status[0]))!=1) start(); else{echo "already working...";} function start() { file_put_contents("status.txt", 1);//Start work sleep(10); file_put_contents("status.txt", 0);//End work } попробуй так
PHP: <? if (!file_exists("status.txt")) file_put_contents("status.txt", 0);//Create status.txt with value "0" //Read "status.txt" $status = file("status.txt"); if(strpos($status[0], '1') === false){ start(); } else{ echo "already working..."; } function start() { file_put_contents("status.txt", 1);//Start work sleep(10); file_put_contents("status.txt", 0);//End work } попробуй так.
На одном форуме мне подсказали, что если запускать один и тот же скрипт, в новой вкладке, пока не выполнится первый скрипт - второй не запуститься. Только что проверил, запустил 3 раза один и тот же скрипт с sleep(5) в новых вкладках практически одновременно - они завершили работу не одновременно, они выполнялись по очереди. Вот почему мой скрипт не работает.
Существует такое понятие, как блокирование при открытие файлов. Можно файл открывать с блокированием, можно без, скорей всего php в стандарте работает не в блокирующем режиме... http://www.php.net/manual/ru/function.flock.php - тебя это спасет, по крайней мере с твоей реализации синхронизации. Для общего развития http://habrahabr.ru/post/193270/ http://phpclub.ru/detail/article/shared_memory
Вот еще почитай комментарий http://www.php.net/manual/en/function.getmypid.php#93753 http://abhinavsingh.com/blog/2009/12/how-to-use-locks-in-php-cron-jobs-to-avoid-cron-overlaps/
Если суть в том чтобы видеть что скрипт не завис и работает, проще очищать буфер вывода, а до очистки можно формировать инфу скажем в %. Сам использую когда скрипт, что-нить парсит, а обычно это не быстро.
запускайте php-cli и не парьтесь) на вдске через screen вообще удобно, запустил, отключился от ссх и забыл, потом зашел, проверил и остановил если что.
Попробуй так: PHP: <? function start() { file_put_contents("status.txt", "1");//Start work sleep(10); file_put_contents("status.txt", "0");//End work } if (!file_exists("status.txt")) file_put_contents("status.txt", "0");//Create status.txt with value "0" //Read "status.txt" $status = file("status.txt"); print_r($status); if($status[0]!=="1") start(); else echo "already working...";