при отладке кода скручивания используйте CURLOPT_VERBOSE и опубликуйте журнал CURLOPT_VERBOSE при обращении за помощью. также при отладке не игнорируйте возвращаемые значения curl_setopt, потому что он возвращает bool (false), если произошла ошибка, и если была ошибка, эта ошибка, вероятно, объясняет, почему код не работает. также не игнорируйте возвращаемое значение curl_exec, потому что оно возвращает bool (false), если произошла ошибка, которая остается незамеченной, если вы игнорируете возвращаемое значение (и ваш код делает)
вот версия вашего кода, которая не игнорирует никаких ошибок и включает ведение журнала CURLOPT_VERBOSE, она должна показать, где ваш код дает сбой:
<?php
$curl = curl_init();
if (! is_resource($curl)) {
throw new \RuntimeException('curl_init() failed!');
}
ecurl_setopt($curl, CURLOPT_URL, 'https://www.amazon.com');
ecurl_setopt($curl, CURLOPT_VERBOSE, 1);
$curlstderr = etmpfile();
$curlstdout = etmpfile();
ecurl_setopt($curl, CURLOPT_STDERR, $curlstderr);
ecurl_setopt($curl, CURLOPT_FILE, $curlstdout);
if (true !== curl_exec($curl)) {
throw new \RuntimeException("curl_exec failed! " . curl_errno($curl) . ": " . curl_error($curl));
}
rewind($curlstderr); // https://bugs.php.net/bug.php?id=76268
rewind($curlstdout); // https://bugs.php.net/bug.php?id=76268
$verbose = stream_get_contents($curlstderr);
$output = stream_get_contents($curlstdout);
curl_close($curl);
fclose($curlstderr);
fclose($curlstdout);
var_dump($verbose, $output);
function ecurl_setopt ( /*resource*/$ch, int $option , /*mixed*/ $value): bool
{
$ret = curl_setopt($ch, $option, $value);
if ($ret !== true) {
// option should be obvious by stack trace
throw new RuntimeException('curl_setopt() failed. curl_errno: ' . return_var_dump(curl_errno($ch)) . '. curl_error: ' . curl_error($ch));
}
return true;
}
function etmpfile()
{
$ret = tmpfile();
if (false === $ret) {
throw new \RuntimeException('tmpfile() failed!');
}
return $ret;
}
также, похоже, что https://www.amazon.com имеет ошибку, см. это ошибка при отправке ответа gzip-сжатым клиентам, которые не указывают Accept-Encoding: gzip?
- в любом случае, чтобы curl автоматически распаковывал сжатый gzip ответ от amazon, добавьте
ecurl_setopt($curl,CURLOPT_ENCODING,'');
, который говорит libcurl добавить заголовок Accept-Encoding: gzip,deflate
, и автоматически распакует результат.