PHP + fork (): как запустить fork в PHP-коде

Я запускаю свой код на CodeIgniter – Ubuntu Server.

Я занимаюсь поиском асинхронных способов запуска функций.

Это моя функция:

<?php // Registers a new keyword for prod to the DB. public function add_keyword() { $keyword_p = $this->input->post('key_word'); $prod = $this->input->post('prod_name'); $prod = $this->kas_model->search_prod_name($prod); $prod = $prod[0]->prod_id; $country = $this->input->post('key_country'); $keyword = explode(", ", $keyword_p); var_dump($keyword); $keyword_count = count($keyword); echo "the keyword count: $keyword_count"; // problematic part that needs forking for ($i=0; $i < $keyword_count ; $i++) { // get new vars from $keyword_count // run API functions to get new data_arrays // inserts new data for each $keyword_count to the DB } // Redirect to main page. redirect('banana/kas'); } 

«Foreach» использует переменные с медленными API-интерфейсами и обновляет базу данных.

Я видел некоторые уроки, использующие fork, но не совсем понял его синтаксическую часть. Большинство вещей, которые я нашел, были просто объяснением того, как это работает (2 процесса: родительский-детский ect), но не дали хорошего объяснения того, как применять это в коде.

Может ли кто-нибудь объяснить, как я работаю с синтаксисом fork ()?

Продолжить выполнение PHP после отправки ответа HTTP

http://www.onlinetechtutorials.com/2014/06/how-to-run-php-code-asynchronously.html

http://php.net/manual/en/function.pcntl-fork.php (более общий)

Со стороны сервера: https://www.youtube.com/watch?v=xVSPv-9x3gk

EDIT :

Правильно ли я понял?

 <?php // Registers a new keyword for prod to the DB. public function add_keyword() { $keyword_p = $this->input->post('key_word'); $prod = $this->input->post('prod_name'); $prod = $this->kas_model->search_prod_name($prod); $prod = $prod[0]->prod_id; $country = $this->input->post('key_country'); $keyword = explode(", ", $keyword_p); var_dump($keyword); $keyword_count = count($keyword); echo "the keyword count: $keyword_count"; for ($i=0; $i < $keyword_count ; $i++) { // create your next fork $pid = pcntl_fork(); if(!$pid){ //*** get new vars from $keyword_count //*** run API functions to get new data_arrays //*** inserts new data for each $keyword_count to the DB print "In child $i\n"; exit($i); // end child } } // we are the parent (main), check child's (optional) while(pcntl_waitpid(0, $status) != -1){ $status = pcntl_wexitstatus($status); echo "Child $status completed\n"; } // your other main code: Redirect to main page. redirect('banana/kas'); } ?> 

Это не вызовет никаких проблем с использованием этого внутри цикла? будет ли известно, чтобы укладывать каждый процесс?

Вы должны указать, какую операционную систему вы используете, поскольку расширения pcntl недоступны на платформе Windows
Также вы должны знать, что активация управления процессом в Linux / Unix на веб-сервере может дать вам неожиданные результаты, поэтому рекомендуется использовать только режим CLI / CGI для использования PCNTL
Пожалуйста, внимательно прочитайте это введение PCNTL

Теперь ваш код кажется правильным и хорошо реализованным, но вы должны скомпилировать свой PHP с помощью этой опции --enable-pcntl чтобы включить функции pcntl, такие как int pcntl_fork(void) иначе вы получите

Неустранимая ошибка: вызов неопределенной функции pcntl_fork ()

Для меня лучшим решением для запуска функций / методов по асинхронному способу является использование pthreads , если вы заинтересованы в этом совете, я могу отредактировать свой ответ, добавив примеры и как установить его на платформах Windows или Linux

Прочитайте эту статью, чтобы узнать, как скомпилировать PHP

У вас есть одна вилка после pcntl_fork (), проверьте $ pid, а затем вы можете ее использовать. Повторите попытку для большего количества вилок.

 <?php for($i = 1; $i <= 3; ++$i){ // create your next fork $pid = pcntl_fork(); if(!$pid){ // begin child, your execution code sleep(1); print "In child $i\n"; exit($i); // end child } } // we are the parent (main), check child's (optional) while(pcntl_waitpid(0, $status) != -1){ $status = pcntl_wexitstatus($status); echo "Child $status completed\n"; } // your other main code ?> 

Для асинхронных HTTP-запросов вы можете использовать multicurl: http://php.net/manual/en/function.curl-multi-init.php

Насколько мне известно, вы можете достичь этого двумя способами …

Использование:

  • Pthreads
  • Amphp
  • Pthreads – библиотека параллельной обработки, а amp – чистая асинхронная структура …

    Таким образом, способ использования pthreads extension=/path/to/pthread.so в том, чтобы сначала загрузить / включить расширение pthreads и добавить extension=/path/to/pthread.so в файл php.ini …

    А затем создайте класс, который расширяет класс Thread и отменяет запуск метода, и помещает в него все, что вы хотите сделать параллельно.

    Поэтому для вашей конкретной цели класс может быть примерно таким:

     <?php class Inserter extends Thread { public $db_con = null; public $data; public function __construct($db_connection, $data) { $this->db_con = $db_connection; $this->data = data; } private function run() { // use your logic to insert the data... } } 

    Чтобы использовать это, просто создайте экземпляр класса и поместите переменную соединения DB и данные, которые будут обрабатываться в ctor. И вызвать метод запуска объекта. Подобно:

     $inserter = new Inserter($dbConn, $data); $inserter->start(); 

    Где $dbConn хранит соединение БД, а $data хранит необходимые данные.

    Вот и все…