Как решить проблему с одновременным выполнением скриптов php?

Ссылка скопирована
PHP
1 ответ

На сервере всего около 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
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Ирина WP Ответ

    Для решения проблемы с одновременным выполнением скриптов PHP можно использовать несколько подходов.

    1. Использование сеансов (sessions): Вы можете использовать сеансы для управления одновременным выполнением скриптов. Вы можете установить блокировку на сеанс, чтобы предотвратить одновременный доступ к определенным ресурсам или переменным. Например, вы можете использовать функцию session_start() в начале каждого скрипта и затем использовать session_write_close() в конце скрипта, чтобы разблокировать сеанс.

    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);

    $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();

    $db = new PDO("mysql:host=localhost;dbname=test", "username", "password"); $db->beginTransaction(); // ваш код здесь $db->commit();

    Это лишь некоторые из способов решения проблемы с одновременным выполнением скриптов PHP. Выбор метода зависит от конкретной ситуации и требований вашего приложения.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно