fork не работает, хотя я проверил, что он установлен и работает на моем сервере

Я установил 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 (в синтаксисе или с сервера).

Можете ли вы помочь мне отладить проблему?

0

Решение

http://www.electrictoolbox.com/mysql-connection-php-fork/

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

Решение Решение состоит в том, чтобы отключиться от базы данных, прежде чем
разветвление подпроцессов, а затем установить новое соединение в каждом
процесс. Четвертый параметр также должен быть передан
функция mysql_connect как «true», чтобы гарантировать, что новая ссылка установлена;
по умолчанию используется общий доступ к существующему соединению, это данные для входа
подобные.

Вопрос в том!

Это эффективно для подключения к серверу у ребенка, и если есть какие-либо другие альтернативные способы сделать это лучше.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]