curl — вызов PHP-файла из цикла PHP в фоновом режиме

У меня есть цикл PHP, где мне нужно вызвать другой PHP-файл в фоновом режиме, чтобы вставить / обновить некоторую информацию на основе переменной, отправленной в него. Я пытался использовать CURL, но это не похоже на работу.

Мне нужно, чтобы он вызывал SQLupdate.php? Symbol = $ symbol — Есть ли другой способ вызова этого PHP с параметром в фоновом режиме — и можно ли это в конечном итоге сделать синхронно с ответом обратно для каждого цикла?

while(($row=mysqli_fetch_array($res)) and ($counter < $max))
{
$ch = curl_init();
$curlConfig = array(
CURLOPT_URL            => "SQLinsert.php",
CURLOPT_POST           => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS     => array(
'symbol' => $symbol,

)
);
curl_setopt_array($ch, $curlConfig);
$result = curl_exec($ch);
curl_close($ch);
}

0

Решение

Я собираюсь взвесить здесь в надежде получить этот «прочь & сделанный».

Хотя это не совсем понятно из вашего поста, похоже, вы пытаетесь вызвать свой PHP-файл по протоколу HTTP (s).

Во многих конфигурациях PHP вы можете сделать это и избежать потенциальных затрат cURL, используя вместо этого file_get_contents ():

while(($row=mysqli_fetch_array($res)) and ($counter < $max)) {

$postdata = http_build_query(
array(
'symbol' => $row['symbol']
)
);

$opts = array('http' =>
array(
'method'  => 'POST',
'header'  => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);

$context = stream_context_create($opts);

$result = file_get_contents('http://example.com/SQLinsert.php', false, $context);

$counter++; // you didn't mention this, but you don't want a everloop...
}

На самом деле это пример учебника, скопированного из руководства.

Вместо этого использовать cURL, как вы пытались сделать изначально, и на самом деле это кажется довольно чистым с одним вызовом curl_setopt () внутри цикла:

$ch = curl_init();
$curlConfig = array(
CURLOPT_URL            => "http://example.com/SQLinsert.php",
CURLOPT_POST           => true,
CURLOPT_RETURNTRANSFER => true
);
curl_setopt_array($ch, $curlConfig);

while(($row=mysqli_fetch_array($res)) and ($counter < $max)) {

curl_setopt($ch, CURLOPT_POSTFIELDS, array('symbol' => $row['symbol']));
$result = curl_exec($ch);
$counter++; //see above
}
// do this *after* the loop
curl_close($ch);

Сейчас реальная и оригинальная проблема может заключаться в том, что символ $ не инициализирован; по крайней мере, это не в приведенном вами примере. Я попытался исправить это с помощью $ Строки [ ‘символ’] в обоих моих примерах. Если это не имя столбца в базе данных, вам, очевидно, нужно будет использовать правильное имя.

Наконец, имейте в виду, что почти всегда лучше получить доступ к вторичному ресурсу с помощью самого быстрого доступного механизма; если «SQLinsert.php» является локальным по отношению к вызывающему сценарию, использование HTTP (s) будет ужасно неэффективным, и вам следует переписать обе части системы для работы с локальной (например, «дисковой») точки -обзор (который уже был рекомендован множеством комментаторов):

//SQLinsert.php
function myInsert($symbol) {
// you've not given us any DB schema information ...
global $db; //hack, *cough*
$sql = "insert into `myTable` (symbol) values('$symbol')";
$res = $this->db->query($sql);
if ($res) return true;
return false;
}

//script.php

require_once("SQLinsert.php");

while(($row=mysqli_fetch_array($res)) and ($counter < $max)) {

$ins = myInsert($row['symbol']);

if ($ins) { // let's only count *good* inserts, which is possible
// because we've written 'myInsert' to return a boolean
$counter++;
}
}
1

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

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

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