PHP статус работы скрипта

Discussion in 'PHP' started by BOSS, 9 Dec 2013.

  1. BOSS

    BOSS Member

    Joined:
    15 Jun 2010
    Messages:
    86
    Likes Received:
    5
    Reputations:
    0
    Я добавляю в файл 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]!=1start();
    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 запускается. В чем моя ошибка?
     
  2. Melfis

    Melfis Elder - Старейшина

    Joined:
    25 Apr 2011
    Messages:
    505
    Likes Received:
    105
    Reputations:
    53
    Скорее всего в том, что $status[0] - строка, а ты сравниваешь с int. Но я не уверен в этом, потому что хз как пых делает приведение типов при сравнении и делает ли вообще.
     
  3. wapik

    wapik New Member

    Joined:
    23 Jan 2013
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    <?
    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
    }

    попробуй так
     
  4. BOSS

    BOSS Member

    Joined:
    15 Jun 2010
    Messages:
    86
    Likes Received:
    5
    Reputations:
    0
    Пздц какой-то, ничего не работает, второй день уже парюсь с какой-то мелкой проблемой. Магия.
     
  5. Sleep

    Sleep Elder - Старейшина

    Joined:
    31 Oct 2007
    Messages:
    274
    Likes Received:
    65
    Reputations:
    4
    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
    }
    попробуй так.
     
  6. BOSS

    BOSS Member

    Joined:
    15 Jun 2010
    Messages:
    86
    Likes Received:
    5
    Reputations:
    0
    На одном форуме мне подсказали, что если запускать один и тот же скрипт, в новой вкладке, пока не выполнится первый скрипт - второй не запуститься. Только что проверил, запустил 3 раза один и тот же скрипт с sleep(5) в новых вкладках практически одновременно - они завершили работу не одновременно, они выполнялись по очереди. Вот почему мой скрипт не работает.
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    Существует такое понятие, как блокирование при открытие файлов. Можно файл открывать с блокированием, можно без, скорей всего php в стандарте работает не в блокирующем режиме...

    http://www.php.net/manual/ru/function.flock.php - тебя это спасет, по крайней мере с твоей реализации синхронизации.

    Для общего развития
    http://habrahabr.ru/post/193270/
    http://phpclub.ru/detail/article/shared_memory
     
    _________________________
  8. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Вот еще почитай комментарий
    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/
     
  9. yandex2

    yandex2 New Member

    Joined:
    13 Nov 2012
    Messages:
    15
    Likes Received:
    2
    Reputations:
    1
    Если суть в том чтобы видеть что скрипт не завис и работает, проще очищать буфер вывода, а до очистки можно формировать инфу скажем в %.
    Сам использую когда скрипт, что-нить парсит, а обычно это не быстро.
     
  10. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    запускайте php-cli и не парьтесь) на вдске через screen вообще удобно, запустил, отключился от ссх и забыл, потом зашел, проверил и остановил если что.
     
  11. joomla

    joomla New Member

    Joined:
    20 Aug 2011
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Попробуй так:

    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...";