Php-запросы обрабатываются разными процессами, и каждый из них имеет свое состояние, нет никакого резидентного процесса, как в другой среде веб-разработки. Вы должны обрабатывать это поведение непосредственно в своем классе, используя, например, некоторое кэширование.
Метод, который запрашивает состояние сервера, должен иметь эту логику
public function getStatus() {
if (!$status = $cache->load()) {
// cache miss
$status = // do your query here
$cache->save($status); // store the result in cache
}
return $status;
}
Таким образом, только один запрос X извлечет реальный статус. Значение X зависит от конфигурации вашего кэша.
Некоторая библиотека кеша, которую вы можете использовать:
Или вы можете сохранить результат в текстовом файле и при каждом запросе проверять m_time
самого файла и перезаписывать его, если прошло более xx секунд.
Обновление
Ваш код довольно странный, почему все эти sleep
звонки? Почему блок try / catch, когда ImageCreateFromPNG
не выбрасывает?
Вы задаете другой вопрос, так как php не является сервером приложений и не может сохранять состояние между процессами, ваш подход верен. Я предлагаю вам использовать APC (использует разделяемую память, так что это будет как минимум в 10 раз быстрее, чем чтение файла) для обмена статусами между различными процессами. При таком подходе ваш код может стать
public function getFile($filename)
{
$latest_update = apc_fetch('latest_update');
if (false == $latest_update) {
// cache expired or first request
apc_store('latest_update', time(), 8); // 8 is the ttl in seconds
// fetch file here and save on local storage
self::updateFile($filename);
}
// here you can process the file
return $your_processed_file;
}
При таком подходе код в части if будет выполняться из двух разных процессов, только если процесс заблокирован сразу после строки if, что не должно происходить, поскольку почти атомарная операция.
Более того, если вы хотите убедиться, что вам нужно использовать что-то вроде семафоров , чтобы справиться с этим, но это будет слишком большим решением для такого рода требований.
Наконец, 8 секунд - это небольшой интервал, я бы использовал что-то большее, по крайней мере, 30 секунд, но это зависит от ваших требований.