Я установил fork на свой сервер Ubuntu (используя PHP-Apache-Codeigniter) и проверил, работает ли он, используя var_dump (extension_loaded('pcntl'));
и получил «истинный» вывод (Как проверить, существует ли модуль PCNTL).
У меня есть этот код:
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";
// Create fork
$pid = pcntl_fork();
if(!$pid){
for ($i=0; $i < $keyword_count ; $i++) {
// Inserts the inputs to the "keywords" table
$this->kas_model->insert_keyword($keyword[$i], $prod, $country);
// Gets relevant IDs for the inserted prod and keyword
$last_inserted_key = $this->kas_model->get_last_rec('keywords');
$keyword_id = $last_inserted_key[0]->key_id;
$prod_id = $last_inserted_key[0]->key_prod;
$prod_id_query = $this->kas_model->get_prod_row_by_id($prod_id);
$prod_id_a = $prod_id_query[0]->prod_a_id;
$prod_id_b = $prod_id_query[0]->prod_b_id;
// Run the keyword query (on API) for today on each one of the keys and insert to DB aslong that the ID isn't 0.
if ( ($prod_id_a != 0) || ( !empty($prod_id_a) ) ) {
$a_tdr = $this->get_var1_a_by_id_and_kw( $prod_id_a, $keyword[$i], $country);
} else {
$a_tdr['var1'] = 0;
$a_tdr['var2'] = 0;
$a_tdr['var3'] = 0;
}
if ( ($prod_id_b != 0) || ( !empty($prod_id_b) ) ) {
$b_tdr = $this->get_var1_b_by_id_and_kw($prod_id_b, $keyword[$i], $country);
} else {
$b_tdr['var1'] = 0;
$b_tdr['var2'] = 0;
$b_tdr['var3'] = 0;
}
$this->kas_model->insert_new_key_to_db($keyword_id, $a_tdr['var1'], $b_tdr['var1'], $a_tdr['var2'], $b_tdr['var2'], $a_tdr['var3'], $b_tdr['var3']);
}
exit($i);
}// we are the parent (main), check child's (optional)
while(pcntl_waitpid(0, $status) != -1){
$status = pcntl_wexitstatus($status);
// echo "Child $status completed\n";
redirect('main/kas');
}
redirect('main/kas');
}
Что делает функция?
Эта функция получает 1 или более ключевых слов / с, переменную страны и идентификатор продукта, а также выполняет запрос к внешнему медленному API, получающему переменные (запускает другие функции из этого же контроллера), и добавляет их в базу данных.
проблема: При запуске этой функции, и если я вставляю много ключевых слов, страница загружается, загружается и загружается в течение длительного времени, пока это не будет сделано, и только затем — Я могу продолжить просмотр моего сайта. Поэтому мне сказали, чтобы он разветвлялся, так как он просто отправляет запрос на обработку в фоновом режиме, поэтому, когда я нажимаю кнопку отправки, меня перенаправляют на «main / kas».
В настоящее время: Я не перенаправлен, но функция работает без ошибок.
Мне сказали, что это должно работать, но это не так — поэтому я предполагаю, что я делаю что-то не так в коде (?), Или что-то еще не работает изнутри сервера (???). Я впервые работаю с форком, поэтому я не знаю, как работать с in (в синтаксисе или с сервера).
Можете ли вы помочь мне отладить проблему?
http://www.electrictoolbox.com/mysql-connection-php-fork/
Причина ошибки Все родительские и дочерние процессы имеют одинаковые
подключение к базе данных. Когда выходит первый дочерний процесс, он будет
отключить от базы данных, что означает то же самое соединение все
процессы будут отключены, вызывая дальнейшие запросы
терпеть неудачу.Решение Решение состоит в том, чтобы отключиться от базы данных, прежде чем
разветвление подпроцессов, а затем установить новое соединение в каждом
процесс. Четвертый параметр также должен быть передан
функция mysql_connect как «true», чтобы гарантировать, что новая ссылка установлена;
по умолчанию используется общий доступ к существующему соединению, это данные для входа
подобные.
Вопрос в том!
Это эффективно для подключения к серверу у ребенка, и если есть какие-либо другие альтернативные способы сделать это лучше.
Других решений пока нет …