Использовать методы управления в фоновом режиме

Я начну с того, что делает моя программа. Функция индекса контроллера принимает массив URL-адресов и ключевых слов и сохраняет их в БД. Теперь метод crawlLink использует все ключевые слова и URL-адреса. Поиск URL-адресов по всем ключевым словам и подсылкам всех URL-адресов генерируются и снова хранятся в БД, которые также ищут ключевые слова. Поиск по ключевым словам осуществляется по каждой ссылке с использованием метода поиска . Подлинки извлекаются из всех URL-адресов, используя функцию extract_links . поиск и extract_links имеют метод get_web_page, который принимает полное содержимое страницы с использованием cURL. get_web_page используется один раз в функции поиска, чтобы получить содержимое веб-страницы, чтобы можно было извлечь из нее ключевые слова. Он также используется в функции extract_links для извлечения ссылок с действительным содержимым страницы.

Теперь crawlLink дважды вызывает функцию поиска . Как только извлечь ключевые слова из ссылок домена и второй раз, чтобы извлечь ключевые слова из подъязыков. Следовательно, get_web_page называется трижды. Это приблизительно занимает 5 минут, чтобы получить содержимое около 150 ссылок. И это называется трижды, поэтому требуется 15 минут обработки. В течение этого времени ничего нельзя сделать. Таким образом, я хочу запустить этот процесс в фоновом режиме и показать его статус во время обработки. extract_links и get_web_page включены в контроллер, используя include_once.

Функция get_web_page выглядит следующим образом:

function get_web_page( $url ) { $options = array( CURLOPT_RETURNTRANSFER => true, // return web page CURLOPT_HEADER => false, // don't return headers CURLOPT_FOLLOWLOCATION => true, // follow redirects CURLOPT_ENCODING => "", // handle compressed CURLOPT_USERAGENT => "spider", // who am i CURLOPT_AUTOREFERER => true, // set referer on redirect CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect CURLOPT_TIMEOUT => 120, // timeout on response CURLOPT_MAXREDIRS => 10, // stop after 10 redirects ); $ch = curl_init( $url ); curl_setopt_array( $ch, $options ); $content = curl_exec( $ch ); $err = curl_errno( $ch ); $errmsg = curl_error( $ch ); $header = curl_getinfo( $ch ); curl_close( $ch ); $header['errno'] = $err; $header['errmsg'] = $errmsg; $header['content'] = $content; return $header; } 

Ввод URL-адресов и ключевых слов один раз от пользователя может рассматриваться как задача. Теперь эта задача может быть запущена, и она начнет работать в фоновом режиме. В то же время можно определить и запустить другую задачу. Каждая задача будет иметь такие статусы, как «Делать», «Выполнять», «Ожидание», «Готово» и т. Д. Простая панель задач Оскаром Диасом – это точный способ, которым я хочу, чтобы задачи отображались.

Я читал о многих способах запуска функции в фоновом режиме, и теперь у меня возникает дилемма о том, какой подход принять. Я читал о exec, pcntl_fork, Gearman и других, но все они нуждаются в CLI, который я не хочу использовать. Я попытался установить Gearman с Cygwin, но застрял в установке Gearman, так как он не может найти libevent. Я установил libevent отдельно, но все равно он не работает. И Gearman нуждается в CLI, поэтому бросил его. Я также не хочу использовать CRON. Я просто хочу знать, какой подход будет лучше всего в моем сценарии.

Я использую PHP 5.3.8 | Codeigniter 2.1.3 | Apache 2.2.21 | MySQL 5.5.16 | Windows 7 64 бит

Ваша проблема в Windows.

окна просто не очень хороши для выполнения фоновых задач и заданий cron – есть инструменты, которые вы можете найти, но они ограничены.

Однако, вы уверены, что вам это тоже нужно? Большинство серверов – это Linux, поэтому почему бы вам просто не протестировать Windows и переехать.

Вторая часть – это командная строка – вам это нужно, если вы хотите начать новый процесс (который вы делаете). Но Ти не очень страшно. CodeIgniter довольно прост:

http://ellislab.com/codeigniter/user-guide/general/cli.html

Вы можете работать с использованием nohup-процесса или с помощью задания cron …………. Пожалуйста, перейдите по ссылкам ниже

nohup: запустить PHP-процесс в фоновом режиме

Запуск фонового процесса php5 под Linux

https://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/

Вышеупомянутый подход, который я пытался достичь, не представляется возможным реализовать в Windows. Многие методы, перечисленные в вопросах, удаляются или изменяются. Затем я перешел к обходному пути с использованием AJAX .

Я выполняю метод контроллера как ajax-запрос и присваиваю ему счет, который увеличивается с каждым новым запросом AJAX. Каждый запрос может быть прерван, хотя обработка будет продолжена, но в конечном итоге результат будет иметь значение в моем проекте, даже если они будут приняты неполными. И если браузер открыт, то этот запрос может завершиться, и позже пользователь сможет увидеть полный результат.

При остановке обработки задачи отображается значок CANCELED и отображается ссылка, указывающая на страницу результатов, которая отображает результаты, сгенерированные до отмены задачи. В случае сбоя AJAX или успеха AJAX я возвращаю счет задачи от сервера к клиенту, который был отправлен клиентом на сервер. Таким образом, результаты отображаются для уникальной задачи и не перепутаны.

Но отслеживания того, насколько определенная задача не продвинулась, не отслеживается. Время, затраченное на выполнение, не может быть идентифицировано. Таким образом, этот подход работает для меня, но имеет некоторые недостатки. Основная цель заключалась в том, что пользователь не должен ждать, пока выполняется какая-то задание, и это каким-то образом достигается вышеупомянутым обходным решением.