blob: e48e3780d38776289761aee771f35aaff59a20d7 [file]
<?php
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use Webmozart\Assert\Assert;
require_once dirname(__DIR__) . "/vendor/autoload.php";
{
curl_multi_request([]);
}
{
$curl_callbacks = [
[
'curl' => (function () {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:9011/curl.test.php?multi=1");
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, ["foo" => "bar"]);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["X-FOO:BAR"]);
return $ch;
})(),
'callback' => function ($output) {
Assert::same($output, "ok");
},
],
[
'curl' => (function () {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "http://127.0.0.1:9011/curl.test.php?multi=2",
CURLOPT_TIMEOUT => 10,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => ["foo" => "bar"],
CURLOPT_HTTPHEADER => ["X-FOO: BAR"],
]);
return $ch;
})(),
'callback' => function ($output) {
Assert::same($output, "ok");
},
],
[
'curl' => (function () {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:9011/not-exists.php?multi=3");
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
return $ch;
})(),
'callback' => function ($output) {},
],
];
curl_multi_request($curl_callbacks);
}
sleep(5);
echo "ok";
function curl_multi_request($curl_callbacks) {
$mh = curl_multi_init();
foreach ($curl_callbacks as $curl_callback) {
curl_multi_add_handle($mh, $curl_callback['curl']);
}
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
if (curl_multi_select($mh) == -1) {
return;
}
do {
$mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
while ($info = curl_multi_info_read($mh)) {
$content = curl_multi_getcontent($info['handle']);
foreach ($curl_callbacks as $curl_callback) {
if ($curl_callback['curl'] == $info['handle']) {
call_user_func($curl_callback['callback'], $content);
break;
}
}
}
foreach ($curl_callbacks as $curl_callback) {
curl_multi_remove_handle($mh, $curl_callback['curl']);
}
curl_multi_close($mh);
}