Задать вопрос
@Us59

Как передать array через POST?

Есть файл start.php в нем я должен отправить POST запрос содержащий массив в файл script.php

Пример массива:
array(4) {
  [0]=>
  array(2) {
    ["Id"]=>
    string(6) "156125"
    ["TEST"]=>
    string(15) "1234"
  }
  [1]=>
  array(2) {
    ["Id"]=>
    string(6) "156126"
    ["TEST"]=>
    string(15) "1234"
  }
  [2]=>
  array(2) {
    ["Id"]=>
    string(6) "156127"
    ["TEST"]=>
    string(15) "1234"
  }
  [3]=>
  array(2) {
    ["Id"]=>
    string(6) "156128"
    ["TEST"]=>
    string(15) "1234"
  }
}

Важно для меня, чтобы я отправил POST запрос и он уже выполнялся сам, чтобы файл start.php не ждал пока в файле script.php завершит свои действия которые могут выполняться в течении 20-30 секунд).
Как я могу это сделать?
  • Вопрос задан
  • 3560 просмотров
Подписаться 2 Простой 8 комментариев
Пригласить эксперта
Ответы на вопрос 2
@bkosun
// Input
$data = extract($_POST);

// Output
$url = 'http://api.example.com';

$data = array('foo' => 'bar');

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

$result = curl_exec($ch);
curl_close($ch);


Можно использовать параметры CURLOPT_TIMEOUT/CURLOPT_CONNECTTIMEOUT, чтобы автоматически разрывать соединение. При отправке запроса будет ошибка, но запрос выполнится:

curl_setopt($ch, CURLOPT_TIMEOUT, 1);

https://www.php.net/manual/ru/function.curl-setopt.php

По хорошему, нужно использовать очередь сообщений. Так же можно попробовать запустить процесс в фоновом режиме:
Как правильно запустить внешний скрипт в фоновом режиме?

Еще, как вариант, Вы можете сбросить соединение на стороне script.php без остановки скрипта, если на сервере используется FastCGI (FPM):

fastcgi_finish_request();

https://php.net/manual/ru/function.fastcgi-finish-...
https://ruhighload.com/%D0%90%D1%81%D0%B8%D0%BD%D1...
Ответ написан
Комментировать
Digiport
@Digiport
PHP рулит
Можно и без CURL
function wbAuthPostContents($url, $post=null, $username=null,$password=null) {
	if (func_num_args()==3) {
		$password=$username;
		$username=$get;
		$post=array();
	}
	if (!is_array($post)) $post=(array)$post;

    $cred = sprintf('Authorization: Basic %s', base64_encode("$username:$password") );
    $post=http_build_query($post);
    $opts = array(
                'http'=>array(
                    'method'=>'POST',
                    'header'=>$cred,
                    'content'=>$post
                )
            );
    $context = stream_context_create($opts);
    $result = file_get_contents($url, false, $context);
    return $result;
}

В примере ещё и авторизация присутствует.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
18 дек. 2024, в 12:39
1000 руб./за проект
18 дек. 2024, в 12:37
10000 руб./за проект
18 дек. 2024, в 12:22
5000 руб./за проект