PHP try / catch не работает на разных вкладках / в одном браузере - PullRequest
0 голосов
/ 29 февраля 2012

Я работаю со следующим кодом на PHP-скрипте:

try{
    if(file_exists($dir."pid.txt"))throw new Exception("Process is already running");
}
catch(Exception $e){
    die("Warning: ".$e->getMessage()." in ".$e->getFile()." on line ".$e->getLine());
}

touch($dir."pid.txt");
sleep(20); // Just for a proof of concept

В основном сценарий:

Если файл $dir."pid.txt" - где $dir содержит каталог с правами доступа - уже существует, уничтожьте скрипт. Если нет, создайте файл pid.txt и спите в течение 20 секунд.

Предполагается, что этот скрипт будет недоступен дважды.

Если я открою сценарий на одной вкладке и попробую снова на другой вкладке в течение этого 20-секундного периода, сценарий на второй вкладке не умрет. Однако разные вкладки в разных браузерах работают. Я пробовал использовать Chrome, Firefox и IE, последние версии стабильных выпусков.

Я на 100% уверен, что файл "pid.txt" был правильно создан первым скриптом.

Я подозреваю, что это как-то связано с оператором try / catch, потому что если я сделаю

if(file_exists($dir."pid.txt"))die("The process is already running");

это работает. Однако это одна из многих возможных ошибок, и я хотел бы сгруппировать их в операторе try / catch. Вот почему я не хочу продолжать этот последний подход.

Идеи

Ответы [ 2 ]

0 голосов
/ 29 февраля 2012

Как отмечает @Yaniro, для работы скрипта, как предполагалось, должны быть добавлены заголовки без кэширования и сброшено при определении. Конечный код будет:

header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Expires: Sat, 26 Jul 1970 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
flush();

try{
    if(file_exists($dir."pid.txt"))throw new Exception("Process is already running");
}
catch(Exception $e){
    die("Warning: ".$e->getMessage()." in ".$e->getFile()." on line ".$e->getLine());
}

touch($dir."pid.txt");
sleep(20); // Just for a proof of concept

flush() необходимо, если выполнение сценария занимает слишком много времени (что препятствует параллельному выполнению сценария, что является целью кода).

0 голосов
/ 29 февраля 2012

Код должен работать нормально, если $dir."pid.txt" не то, что вы думаете. Или вы ошиблись где-то еще. предоставьте больше кода, если хотите получить более полезный ответ.

...