Как решить проблему с одновременным выполнением скриптов php?
На сервере всего около 6 задач по крону запускаются каждую минуту, задачи не супер тяжелые, на выполнение одной задачи в пик уходит до 2 минут максимум, скрипты парсят информацию с другого источника, проблем в стороннем сервисе не наблюдается, на других сервера и веб-хостингах отдает информацию махом, как будто ограничение какое-то стоит на выполнение задач или еще чего-либо, даже пустой файл php он может грузить по 30 секунд такое чувство что в очереди стоит. Проверял нагрузку она даже до половины не доходит. Как и что нужно проверить чтобы найти проблему?
Дополнительно:
смотрите в сторону cgroups, если Linux
Ответы:
Чтобы не запускался скрипт до окончания можно в начало каждого дописать адаптировав под себя
exec("ps -U #user# -u #user# u", $output, $result); foreach ($output AS $line) if(strpos($line, "you_one_of_six_script.php")) die ......; //прошлое задание еще работает |
exec("ps -U #user# -u #user# u", $output, $result); foreach ($output AS $line) if(strpos($line, "you_one_of_six_script.php")) die ......; //прошлое задание еще работает
Еще можно проверять запущен ли скрипт по крону, и выполнять это проверку только на работающий скрипт для крона. Можно писать каждому скрипту временный файл(или в базу) время его запуска(время, чтобы если скрипт крашнулся и не удалил файл, удалить его) , и удалять этот файл по завершении скрипта. А при запуске проверять наличие и выходить если есть файл.
Это поможет в том случае, если причина в в большом количестве запущенных скриптов, которые копятся как снежный ком не успевая отрабатывать.
- проблему гонки можно решить проще
На стороне пхп скрипта:
Открыть файл с эксклюзивной блокировкой
Или открыть сокет
И то и другое отваливается при завершении скриптаИли перед пыхой вызывать flock по принципу flock … && php …
И тогда не придется вообще дописывать что-то в скрипт - # m h dom mon dow user command
*/20 * * * * root /usr/bin/flock -w 0 /var/cron.lock /usr/bin/myscript
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для решения проблемы с одновременным выполнением скриптов PHP можно использовать несколько подходов.
1. Использование сеансов (sessions): Вы можете использовать сеансы для управления одновременным выполнением скриптов. Вы можете установить блокировку на сеанс, чтобы предотвратить одновременный доступ к определенным ресурсам или переменным. Например, вы можете использовать функцию session_start() в начале каждого скрипта и затем использовать session_write_close() в конце скрипта, чтобы разблокировать сеанс.
session_start(); // ваш код здесь session_write_close();
2. Использование файловых блокировок: Вы можете использовать файловые блокировки для управления одновременным доступом к определенным файлам или ресурсам. Например, вы можете использовать функции flock() для блокировки файла перед его чтением или записью.
$fp = fopen("file.txt", "r+"); if (flock($fp, LOCK_EX)) { // ваш код здесь flock($fp, LOCK_UN); } fclose($fp);
3. Использование базы данных: Если у вас есть база данных, вы можете использовать транзакции для управления одновременным выполнением скриптов. Вы можете начать транзакцию перед выполнением операций чтения или записи и завершить ее после выполнения этих операций.
$db = new PDO("mysql:host=localhost;dbname=test", "username", "password"); $db->beginTransaction(); // ваш код здесь $db->commit();
Это лишь некоторые из способов решения проблемы с одновременным выполнением скриптов PHP. Выбор метода зависит от конкретной ситуации и требований вашего приложения.