Использование PHP-функции filesize () в цикле - возвращает тот же размер - PullRequest
1 голос
/ 05 октября 2011

Я немного освоил PHP-кодирование и знаком с его аспектами.

Я создал PHP-скрипт, который запускается как задание cron, которое извлекает данные из базы данных и при определенных условияхвстречаются, некоторая информация записывается в файл.

Поскольку в базе данных может быть более одного результата, выполняется цикл для выполнения каждого результата в базе данных.

Внутри этогоцикл, у меня есть другой цикл, который будет записывать данные в файл.Затем задание cron используется для вызова этого файла каждую минуту и ​​запуска содержимого в скрипте bash.

Итак, PHP зацикливает его настройку, чтобы увидеть, есть ли в файле что-либо записанное в него с помощью filesize ()функция.Если размер файла не равен нулю, то он будет спать 10 секунд и попытаться прочитать его снова.Вот код:

while(filesize('/home/cron-script.sh') != 0)
{
    sleep(10);
}

К сожалению, когда размер файла запускается, он, похоже, блокирует файл или что-то в этом роде.Задание cron может без проблем выполнить сценарий bash, и самая последняя команда в сценарии - обнулить файл:

cat /dev/null > /home/cron-script.sh

Но, похоже, что после запуска вышеуказанного цикла он блокируетсяв исходном размере файла.В качестве примера я просто вставил слово «exit» в файл cron-script.sh и затем запустил тестовый скрипт:

while(filesize("/home/cron-script.sh") != 0)
{
    echo "filesize: " . filesize("/home/cron-script.sh");
    sleep(10);
}

Цикл бесконечен и будет продолжать отображать «размер файла»: 4 ", когда я вставил слово" выход ".Затем я выполню команду в терминале:

cat /dev/null > /home/cron-script.sh 

, которая затем очистит файл, пока у меня запущен тестовый скрипт выше.Но он продолжает утверждать, что размер файла равен 4 и никогда не возвращается к 0 - поэтому запуск PHP-скрипта выполняется до тех пор, пока не будет достигнут срок выполнения.

Может кто-нибудь дать мне несколько советов о том, как я могу решить эту проблему?По сути, мне просто нужен какой-то способ чтения размера файла - и если в файле есть какие-либо данные, он должен будет циклически выполнять процедуру сна, пока файл не будет очищен.Файл должен очиститься в течение одной минуты (поскольку задание cron вызывает этот файл cron-script.sh каждую минуту).

Спасибо!

Ответы [ 2 ]

13 голосов
/ 05 октября 2011

С http://www.php.net/manual/en/function.filesize.php

Примечание. Результаты этой функции кэшируются.См. Clearstatcache () для более подробной информации.

Чтобы решить эту проблему, не забудьте позвонить clearstatcache() перед вызовом filesize():

while(filesize("/home/cron-script.sh") != 0)
{
    echo "filesize: " . filesize("/home/cron-script.sh");
    sleep(10);
    clearstatcache();
}
0 голосов
/ 05 октября 2011

Результаты filesize кэшируются.

Вы можете использовать clearstatchace для очистки кэша на каждой итерации цикла.

...