我正在构建一个scrape脚本来从网站中提取一些信息,并在测试时我不断收到以下错误:
PHP警告:curl_setopt_array():数组键必须是CURLOPT常量或等效的整数值
它指向我的代码中的以下行:
curl_setopt_array($ch, $curlOptions);
Run Code Online (Sandbox Code Playgroud)
现在$ch来自:
$ch = curl_init($url);
Run Code Online (Sandbox Code Playgroud)
并$url设置为这样(URL是故意的,因为我正在处理因尝试打开网站而产生的错误,如果它不存在):
$url = "https://www.kjsdsajlksajksajdklsadajklda.com";
Run Code Online (Sandbox Code Playgroud)
$curlOptions 设置在这里:
$curlOptions = array(
'CURLOPT_RETURNTRANSFER' => true,
'CURLOPT_HEADER' => true,
'CURLOPT_FOLLOWLOCATION' => true,
'CURLOPT_ENCODING' => "",
'CURLOPT_AUTOREFERER' => true,
'CURLOPT_CONNECTTIMEOUT' => 120,
'CURLOPT_TIMEOUT' => 120,
'CURLOPT_MAXREDIRS' => 10,
'CURLINFO_HEADER_OUT' => true,
'CURLOPT_SSL_VERIFYPEER' => false,
'CURLOPT_HTTP_VERSION' => 'CURL_HTTP_VERSION_1_1',
'CURLOPT_COOKIE' => $cookiesJar,
'CURLOPT_USERAGENT' => $userAgent,
);
Run Code Online (Sandbox Code Playgroud)
我$curlOptions在测试时删除了块,当它被删除时我没有收到错误.但是,注释掉数组的不同元素并不能解决问题,并且错误仍然存在.我已经更改了我使用的URL,但没有任何区别.我也改变的任何实例true或false以1与0分别这也不做了一个差异.
所以我真的有点卡住了.我正在使用PHP 7的Debian 8系统上开发它,版本输出在这里:
PHP 7.0.16-1~dotdeb+8.1 (cli) ( …Run Code Online (Sandbox Code Playgroud) 考虑以下系统配置:
下面的代码片段用于向Sphere-Engine Compilers API发出 http 请求:
$ch = curl_init('http://xxxxxxxx.compilers.sphere-engine.com/api/v4/test?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3.0);
$x = curl_exec($ch);
print_r($x);
Run Code Online (Sandbox Code Playgroud)
当我运行以下 CLI 时,上述脚本完全正常工作:
php script.php
Run Code Online (Sandbox Code Playgroud)
我得到了预期的输出。
但是,当我尝试通过网络浏览器运行它时,它会产生:
CURLE_COULDNT_CONNECT (7) 无法连接() 到主机或代理。
我发现了很多建议,例如添加
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
Run Code Online (Sandbox Code Playgroud)
这对我来说并不是真正的解决方案。关闭我不会做的SELinux 。
注意:当我发出 URL 时,URL 本身工作正常,并且也给了我预期的输出。
有什么建议?提前致谢。
我可以使用 curl 使用 HTTP/3 而不是 HTTP/2、HTTP/1.1 或 HTTP/1.0.curl 来卷曲支持 HTTP/3 的网站吗?这可能吗?如果是这样,如何做到这一点?
所以我显然已经用谷歌搜索了错误 - 但 PHP (PHP 7.4.4 (cli)) curl 给了我错误:
Curl error: operation aborted by callback使用以下代码:
private function curl_post($url,$post,$file = null,$file_type = 'audio/wav'){
$ch = curl_init($url);
if (!empty($file)){
$post['SoundFile'] = new CURLFile(UPLOAD_PATH.$file,$file_type,$file);
}
// Assign POST data
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if(curl_errno($ch)) echo 'Curl error: '.curl_error($ch);
curl_close($ch);
print'<pre>Curl (rec): '."\n";print_r($result);print'</pre>';
}
Run Code Online (Sandbox Code Playgroud)
我控制了两台(Ubuntu)服务器并重新启动了它们。我发布了相当大量的数据,但在谷歌搜索中这似乎并不是触发curl_error的原因。有谁知道是什么原因造成的?它was工作得很好,然后就停止了。
另外,file_put_contents(time().'.txt','log');在我的接收服务器中作为中断确实会记录响应。所以它显然落在了正确的区域。
另外,我要说的是,两台服务器通过curl 彼此进行多次对话(因此一台服务器卷曲到另一台服务器,然后返回一点)。此外 - 错误 42 是 CURL 响应,但https://curl.haxx.se/libcurl/c/libcurl-errors.html似乎没有提供太多帮助。我尝试过跟踪彼此之间的各种调用,但看不出它为什么会中断 - 它在发布/调用发生之前就出现错误/中断。
我有以下第 3 方 API,我正在向其发布图像。
它们要求标头的内容类型必须设置为:Content-Type: image/jpeg,并且正文包含实际图像的二进制数据。
下面我在 PHP 中使用 cURL 发出此请求 -这工作正常:
$url = "examle.org/images";
$pathToFile = "myfile.jpeg";
$auth = "Authorization: Bearer <Token>";
$auth = "Authorization: Bearer " . $this->token;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents($pathToFile));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: image/jpeg', $auth]);
$result = curl_exec($ch);
Run Code Online (Sandbox Code Playgroud)
上面使用 cURL 的 POST 工作正常:我收到 200 响应成功错误。我想,为了让它更像“Laravel”,我会使用 Laravel 的 HTTP 外观(Guzzle):
$post = Http::withHeaders(['Content-Type' => 'image/jpeg'])
->withToken("<Token>")
->attach('file', file_get_contents($pathToFile), 'myfile.jpeg')
->post($url);
Run Code Online (Sandbox Code Playgroud)
上面的内容没有按预期工作。3rd 方 …
我有一个使用Guzzle发出HTTP请求的PHP应用程序.
我收到以下异常:
[curl] 56: Problem (2) in the Chunked-Encoded data [url] http://...
Run Code Online (Sandbox Code Playgroud)
看起来问题在于cURL.我试图从源代码编译最新版本的cURL,但看起来它没有帮助.
可能是什么问题,我该如何解决?
$ curl --version
curl 7.41.0 (i686-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
$ cat /etc/issue
Ubuntu 14.04.2 LTS \n \l
$ composer show -i
guzzle/guzzle v3.9.2 Guzzle is a PHP HTTP client library and framework for building …Run Code Online (Sandbox Code Playgroud) 我现在正在使用Linkedin V2与我的应用程序集成。我在尝试将图片上传到 Linkedin 时遇到问题。
我已经尝试从我的终端发出 CURL 请求(我使用的是 Ubuntu 操作系统)并得到如下响应:
终端命令(工作和文件上传):
curl -i --upload-file /Users/peter/Desktop/superneatimage.png --header "Authorization: Bearer redacted" 'https://api.linkedin.com/mediaUpload/C5522AQGTYER3k3ByHQ/feedshare-uploadedImage/0?ca=vector_feedshare&cn=uploads&m=AQJbrN86Zm265gAAAWemyz2pxPSgONtBiZdchrgG872QltnfYjnMdb2j3A&app=1953784&sync=0&v=beta&ut=2H-IhpbfXrRow1'
Run Code Online (Sandbox Code Playgroud)
它的响应如下:
HTTP/2 201 日期:UTC 2019 年 4 月 10 日星期三 09:14:44 服务器:Play set-cookie:lang=v=2&lang=en-us; 路径=/;Domain=api.linkedin.com x-ambry-creation-time: Wed Apr 10 09:14:44 UTC 2019 access-control-allow-origin: https://www.linkedin.com content-length: 0
当我将 CURL 请求集成到我的应用程序中时,我遇到了问题。我的应用程序中的 CURL 请求代码如下所示。
$headers = array();
$headers[] = 'Authorization: Bearer xxxxx';
$headers[] = 'X-Restli-Protocol-Version: 2.0.0';
$headers[] = 'Content-Type: multipart/form-data';
$ch = curl_init();
$options = array(
CURLOPT_HEADER => true, …Run Code Online (Sandbox Code Playgroud) 我正在开发 REST API,虽然很容易在 cURL 中为 POST 请求设置原始 JSON 数据
$payload = json_encode(array("user" => $data));
//attach encoded JSON string to the POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何使用 GET 请求发送此类数据。
有什么样CURLOPT_GETFIELDS还是CURLOPT_RAWDATA?使用 GET 请求发送 JSON 的目的是传入一些参数。
我不希望将 formdata 添加到请求中,我希望发布 JSON 以便它可以在接收器上进行解析。
谢谢!
编辑:
基于我想避免混淆的评论,因此生成的请求应如下所示:
GET / HTTP/1.1
Host: 127.0.0.1:3000
Content-Type: application/json
Accept: application/json
Host: 127.0.0.1:3000
content-length: 13
Connection: keep-alive
cache-control: no-cache
{
"a": "b"
}
Run Code Online (Sandbox Code Playgroud)
如您所见,此处的 GET 请求具有数据,并且由 Web 服务器解析并完美运行。我如何使用 cURL 实现这一点?
我想使用google-api-php-client以外的 php curl 上传,但我真的不知道该怎么做,这里是文档:发送分段上传请求
这是我的代码片段,我陷入了困境CURLOPT_POSTFIELDS,有人可以帮助我吗?
public function uploadByCurl($uploadFilePath, $accessToken){
$ch = curl_init();
$mimeType = $this->getMimeType($uploadFilePath);
$options = [
CURLOPT_URL => 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => [
'file' => new \CURLFile($uploadFilePath),
// 'name' =>
],
CURLOPT_HTTPHEADER => [
'Authorization:Bearer ' . $accessToken,
'Content-Type:' . $mimeType,
'Content-Length:' . filesize($uploadFilePath),
],
//In case you're in Windows, sometimes will throw error if not set SSL verification to false
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => 0,
]; …Run Code Online (Sandbox Code Playgroud) 我的工作代码通过 SOCKS5 协议使用我的 VPN (NordVPN) 凭据。
最近,他们放弃了对 SOCKS5 的支持,所以我必须使用他们的其他协议,但我无法让任何协议工作。
他们所有可用的协议都可以在这里看到
https://nordvpn.com/servers/tools/
- IKEv2/IPSec
- OpenVPN
- Wireguard
- HTTP Proxy (SSL)
Run Code Online (Sandbox Code Playgroud)
这是我的代码,尝试使用他们的“HTTP 代理(SSL)”协议
$cookie_file = tempnam("/tmp", "CURLCOOKIE");;
$ch = curl_init();
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // in seconds
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_PROXYTYPE, 'HTTP');
curl_setopt($ch, CURLOPT_PROXYPORT, "443");
curl_setopt($ch, CURLOPT_PROXY, "au643.nordvpn.com");
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyUser . ":" …Run Code Online (Sandbox Code Playgroud)