Как мне избежать этого скрипта PHP, вызывающего остановку сервера? - PullRequest
2 голосов
/ 19 января 2011

В настоящее время я использую VPS на основе Linux с 768 МБ памяти Ram.

У меня есть приложение, которое собирает информацию о доменах и затем подключается к службе через cURL для получения сведений о поиске страниц этих доменов.

Когда я запускаю проверку около 50 доменов, удаленной странице требуется около 3 минут, чтобы загрузить все результаты, прежде чем сценарий сможет проанализировать детали и вернуть их в мой сценарий. Это вызывает проблему, так как кажется, что ничто иное не работает до тех пор, пока не завершится выполнение сценария, поэтому пользователи на сайте просто получат таймер / «шарик смерти» в ожидании загрузки страниц.

** (Удаленная страница извлекает сведения о домене и обновляет страницу с помощью AJAX, но запрос curl не (по праву) возвращает страницу до завершения загрузки.

Может кто-нибудь сказать мне, если я делаю что-то явно неправильно, или есть ли лучший способ сделать это. (В очереди может быть от 10 до 10000 доменов, поэтому мне нужен процесс, который может работать в фоновом режиме, не затрагивая остальную часть сайта)

Спасибо

Ответы [ 5 ]

3 голосов
/ 19 января 2011

Более разумным подходом будет «пакетная обработка» данных домена с использованием запускаемого cron PHP-скрипта cli.

Таким образом, как только вы вставите соответствующие домены в таблицу базы данных с флагом «обработано», установленным как ложное, фоновый скрипт будет:

  1. Сканирование базы данных для доменов, которые не помечены как обработанные.

  2. Выполнить поиск CURL и т. Д.

  3. Обновите запись базы данных соответствующим образом и отметьте ее как обработанную.

    ...

Чтобы не перекрывать существующий исполняемый скрипт пакетной обработки, вы должны вызывать php-скрипт каждые пять минут из cron и (в самом PHP-скрипте) проверять, как долго скрипт работал в начале «сканирования». «Сцена и выход, если он работает в течение четырех минут или дольше. (Возможно, вы захотите скорректировать эти цифры, но, надеюсь, вы увидите, куда я иду с этим.)

Используя этот подход, вы сможете оставить фоновый скрипт на неопределенное время (так как он вызывается через cron, он автоматически запустится после перезагрузки и т. Д.) И просто добавить домены в базу данных / просмотреть результаты обработка и т. д. через отдельный веб-интерфейс.

0 голосов
/ 19 января 2011

Хотя я согласен с другими, что вам следует рассмотреть возможность выполнения этих задач вне вашего веб-сервера, более контролируемым образом, я предложу объяснение «остановки сервера».

Если вы используетеВ нативных сессиях php php использует эксклюзивную схему блокировки, поэтому только один процесс php может работать с данным идентификатором сессии за раз.Это может быть вызвано наличием долго работающего php-скрипта, который использует сеансы.

Вы можете искать комбинации таких терминов, как:
Блокировка параллелизма сессии php session_write_close ()

Я уверенобсуждалось здесь много раз.Мне лень искать тебя.Может быть, кто-то еще придет и сделает ответ с маркированными списками и симпатичными гиперссылками в обмен на репутацию stackoverflow :) Но не я :)

удачи.

0 голосов
/ 19 января 2011

Во-первых, извините, но я идиот! :)

Я загрузил сайт в другом браузере (FF), и он загружается нормально.

Кажется, что Chrome устанавливает некоторую блокировку домена, когда ожидает ответа сервера, и я тестировал скрипт вручную через браузер.

Спасибо за вашу помощь и извините за потраченное время.

CJ

0 голосов
/ 19 января 2011

Это не идеальное решение, но если вам нужно запустить этот процесс на основе запроса пользователя, вы можете добавить следующее в конце вашего скрипта.

set_time_limit(0);
flush();

Это позволит сценарию PHP продолжить работу, но он вернет вывод пользователю. А если серьезно, вы должны использовать пакетную обработку. Это даст вам гораздо больший контроль над тем, что происходит.

0 голосов
/ 19 января 2011

Я не уверен, как структурирован ваш код, но вы можете попробовать использовать <a href="http://php.net/manual/en/function.sleep.php" rel="nofollow">sleep()</a>.Это то, что я использую при пакетной обработке.

...