У меня есть сайт с 2000 страницами, и я хочу перебирать каждую страницу для создания файла Sitemap, используя функцию file_get_html()
и регулярные выражения.
Очевидно, что это невозможно завершить в одном исполнении на стороне сервера, так как оно закончится из-за максимального времени выполнения. Я предполагаю, что ему нужно выполнить меньшие действия, сохранить прогресс в базе данных и затем поставить в очередь следующую задачу. Какие-либо предложения?
Когда вы запустите его в командной строке, максимального времени выполнения не будет.
Вы также можете использовать set_time_limit(0);
для этого, если ваш провайдер позволяет манипулировать.
Я не могу сказать, будет ли ваш ip-адрес заблокирован – так как это зависит от безопасности сервера, на который вы отправляете свои запросы.
Другое решение
Вы можете получить одну (или несколько) страницу (-ы) и искать новые URL-адреса в исходном коде. Затем вы можете разместить их в базе данных. Затем в следующем прогоне вы обрабатываете очередь.
Вы должны рассмотреть возможность использования очереди работ и выполнения работника. Я бы порекомендовал Gearman или zeromq . Оба они имеют встроенные привязки php.
Используйте set_time_limit(0)
. Подробнее см. Руководство по PHP .
секунд
Максимальное время выполнения, в секундах. Если установлено равным нулю, лимит времени не налагается.
EDIT: Что касается вашего второго вопроса, это вряд ли, вы должны проверить условия использования хостинга, чтобы узнать, разрешено ли это.
лучший способ для вас – использовать удаленный api. например, вы можете использовать import.io и получать параметры с каждой страницы с помощью json-формата. это способ получить свежую страницу при каждом вызове file_get_content или flie_get_html
но для этого лотка для коррекции значение beter, чем file_get_html
Установите max_execution_time в 0 в php.ini. Это повлияет на каждый скрипт, который вы запускаете на сервере, но если вы ищете исправление на уровне сервера, это сделает это.
http://php.net/manual/en/info.configuration.php#ini.max-execution-time
max_execution_time = 0