标签: php-curl

在PHP 7中使用curl_setopt_array()"数组键必须是CURLOPT常量或等效整数值"

我正在构建一个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,但没有任何区别.我也改变的任何实例truefalse10分别这也不做了一个差异.

所以我真的有点卡住了.我正在使用PHP 7的Debian 8系统上开发它,版本输出在这里:

PHP 7.0.16-1~dotdeb+8.1 (cli) ( …
Run Code Online (Sandbox Code Playgroud)

php php-curl php-7

3
推荐指数
1
解决办法
2983
查看次数

Apache 无法使用 curl 发出传出 HTTP 请求

考虑以下系统配置:

  • 软呢帽 27
  • 启用 SELinux
  • Apache/2.4.33
  • PHP 7.1.17

下面的代码片段用于向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 本身工作正常,并且也给了我预期的输出。

有什么建议?提前致谢。

php apache curl selinux php-curl

3
推荐指数
1
解决办法
2350
查看次数

7.4.2 版本中的 PHP cURL 扩展是否支持带有 HTTP/3 的 cURL

我可以使用 curl 使用 HTTP/3 而不是 HTTP/2、HTTP/1.1 或 HTTP/1.0.curl 来卷曲支持 HTTP/3 的网站吗?这可能吗?如果是这样,如何做到这一点?

php curl php-curl quic http3

3
推荐指数
1
解决办法
1227
查看次数

Curl 错误:操作被回调中止

所以我显然已经用谷歌搜索了错误 - 但 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似乎没有提供太多帮助。我尝试过跟踪彼此之间的各种调用,但看不出它为什么会中断 - 它在发布/调用发生之前就出现错误/中断。

php curl php-curl

3
推荐指数
1
解决办法
1万
查看次数

PHP - 带有二进制正文数据的 POST 请求 - 适用于 CURL,但不适用于 Laravel

我有以下第 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 方 …

php laravel guzzle php-curl

3
推荐指数
1
解决办法
2237
查看次数

cURL:Chunked-Encoded数据中的[P] roblem(2)

我有一个使用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)

curl guzzle php-curl

2
推荐指数
1
解决办法
4496
查看次数

图片上传在 Linkedin V2 API 中不起作用

我现在正在使用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)

php curl php-curl linkedin-api

2
推荐指数
1
解决办法
979
查看次数

如何在 PHP 中使用 curl GET 发送原始数据?

我正在开发 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 实现这一点?

php curl php-curl

2
推荐指数
1
解决办法
2339
查看次数

如何使用 php-curl 将文件以“multipart”类型上传到 GoogleDrive?

我想使用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)

php boundary google-drive-api php-curl

2
推荐指数
1
解决办法
1181
查看次数

带代理的 PHP cURL(不是 SOCKS5)

我的工作代码通过 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)

php vpn proxy curl php-curl

2
推荐指数
1
解决办法
3558
查看次数

标签 统计

php-curl ×10

php ×9

curl ×7

guzzle ×2

apache ×1

boundary ×1

google-drive-api ×1

http3 ×1

laravel ×1

linkedin-api ×1

php-7 ×1

proxy ×1

quic ×1

selinux ×1

vpn ×1