草庐IT

php - 进行可恢复上传时出现 CURL 问题

coder 2024-04-30 原文

我有一个使用 PHP Drive API 中的可恢复上传原型(prototype)的脚本,自从我实现它以来它已经工作了 3 或 4 个月。星期六 17 日,脚本停止工作,由于出现以下问题,crontab 没有运行脚本:

[17-Oct-2015 05:15:07 America/Chicago] PHP Fatal error:  Uncaught exception 'Google_IO_Exception' with message 'HTTP Error: Unable to connect: 'fopen(): SSL: Broken pipe'' in /root/scriptEnCrontab/libs/src/Google/IO/Stream.php:141
Stack trace:
#0 /root/scriptEnCrontab/libs/src/Google/IO/Abstract.php(136): Google_IO_Stream->executeRequest(Object(Google_Http_Request))
#1 /root/scriptEnCrontab/libs/src/Google/Http/MediaFileUpload.php(164): Google_IO_Abstract->makeRequest(Object(Google_Http_Request))
#2 /root/scriptEnCrontab/respaldoDrive_cgi.php(183): Google_Http_MediaFileUpload->nextChunk('\x8EGu\xA9Y\xE9\xEEQ\x9B\xE1\xAD\x98Xw\xEB...')
#3 /root/scriptEnCrontab/respaldoDrive_cgi.php(96): insertFile(Object(Google_Client), Object(Google_Service_Drive), '/root/respaldo/...', 'RespaldoScripts...', '0B2Xiur2QhdC6fk...')
#4 {main}
  thrown in /root/scriptEnCrontab/libs/src/Google/IO/Stream.php on line 141

经过一些调整、升级和安装 cURL,问题变成了其中之一

[20-Oct-2015 18:57:21 America/Chicago] PHP Fatal error:  Uncaught exception 'Google_IO_Exception' with message 'Couldn't resolve host 'www.googleapis.com'' in /root/scriptEnCrontab/libs/src/Google/IO/Curl.php:115
Stack trace:
#0 /root/scriptEnCrontab/libs/src/Google/IO/Abstract.php(136): Google_IO_Curl->executeRequest(Object(Google_Http_Request))
#1 /root/scriptEnCrontab/libs/src/Google/Http/MediaFileUpload.php(164): Google_IO_Abstract->makeRequest(Object(Google_Http_Request))
#2 /root/scriptEnCrontab/respaldoDrive_cgi.php(186): Google_Http_MediaFileUpload->nextChunk('C\x9D\t\xD9\x95\x1F\xAF\xF5!qJ\xCAq\x8CB...')
#3 /root/scriptEnCrontab/respaldoDrive_cgi.php(101): insertFile(Object(Google_Client), Object(Google_Service_Drive), '/root/respaldo/...', 'PaginasWeb.tgz', '0B2Xiur2QhdC6fk...')
#4 {main}
  thrown in /root/scriptEnCrontab/libs/src/Google/IO/Curl.php on line 115

[26-Oct-2015 11:36:24 America/Chicago] PHP Fatal error:  Uncaught exception 'Google_IO_Exception' with message 'Operation timed out after 100000 milliseconds with 0 bytes received' in /root/scriptEnCrontab/libs/src/Google/IO/Curl.php:115
Stack trace:
#0 /root/scriptEnCrontab/libs/src/Google/IO/Abstract.php(136): Google_IO_Curl->executeRequest(Object(Google_Http_Request))
#1 /root/scriptEnCrontab/libs/src/Google/Http/MediaFileUpload.php(164): Google_IO_Abstract->makeRequest(Object(Google_Http_Request))
#2 /root/scriptEnCrontab/respaldoDrive_cgi.php(187): Google_Http_MediaFileUpload->nextChunk('S\x98\x85\xC7\xFE\x0E\x8E8\xEE\xE9\n\xF9\x86{\x19...')
#3 /root/scriptEnCrontab/respaldoDrive_cgi.php(99): insertFile(Object(Google_Client), Object(Google_Service_Drive), '/root/respaldo/...', 'RespaldoScripts...', '0B2Xiur2QhdC6fk...')
#4 {main}
  thrown in /root/scriptEnCrontab/libs/src/Google/IO/Curl.php on line 115

我似乎无法使它与版本 1.1.6、1.1.5 或 1.1.4 一起工作,即使它在没有安装 cURL 的情况下一直与 1.1.4 版本一起工作。

编辑:现在我没有 googleapis 解决问题,但现在它总是操作超时错误。这是我使用 IPv4 CURL 设置运行的详细信息:

* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 308 Resume Incomplete
< X-GUploader-UploadID: AEnB2Uqz5qHxRUf_l-0Eg72_ZVU7fNQ-aMdzSQEzufNGQa2kPM55YHEru0NA3OJQNFidKV7NvUJDQNO9uhVad1q9xHxiTqtqMg
< Range: bytes=0-1992294399
< X-Range-MD5: 91233d77f053f5b383c37ddacf30c29d
< Content-Length: 0
< Date: Fri, 30 Oct 2015 17:21:27 GMT
< Server: UploadServer
< Content-Type: text/html; charset=UTF-8
< Alternate-Protocol: 443:quic,p=1
< Alt-Svc: quic=":443"; p="1"; ma=604800
* HTTP error before end of send, stop sending
<
* Closing connection #0
* About to connect() to www.googleapis.com port 443 (#0)
*   Trying 216.58.217.42...
* connected
* Connected to www.googleapis.com (216.58.217.42) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: /root/scriptEnCrontab/libs/src/Google/IO/cacerts.pem
  CApath: /etc/ssl/certs
* SSL connection using ECDHE-RSA-RC4-SHA
* Server certificate:
*        subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.googleapis.com
*        start date: 2015-10-21 22:31:24 GMT
*        expire date: 2016-01-19 00:00:00 GMT
*        subjectAltName: www.googleapis.com matched
*        issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*        SSL certificate verify ok.
> PUT /upload/drive/v2/files?uploadType=resumable&upload_id=AEnB2Uqz5qHxRUf_l-0Eg72_ZVU7fNQ-aMdzSQEzufNGQa2kPM55YHEru0NA3OJQNFidKV7NvUJDQNO9uhVad1q9xHxiTqtqMg HTTP/1.1
Host: www.googleapis.com
Accept: */*
content-range: bytes 1992294400-2044723199/4840357256
content-type: application/json; charset=UTF-8
content-length: 52428800

我的 PHP 版本是 5.4.45-0+deb7u1,cURL 版本是:7.26.0。感谢 Francois 当前的帮助。

最佳答案

tl;dr 将此添加到您的代码中:

$google_config = new Google_Config();
$google_config->setClassConfig('Google_IO_Curl', 'options',
  array(
    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
  )
);
$google_client = new Google_Client($google_config);

长版:

您的脚本“无法解析主机 'www.googleapis.com'”这一事实暗示了 DNS 问题。 “www.googleapis.com”同时具有 IPv4 和 IPv6 地址。我的猜测是 Google 或您自己的网络有最近的更改或错误导致 IPv6 出现问题。上面的代码强制将主机名解析为 IPv4 地址。

如果这不能解决您的问题,请提供脚本调试输出中的相关部分。也分享您的 PHP 和 cURL 版本。要启用 Google PHP Drive API 的 cURL 详细输出,请在您的代码中添加:

$google_config = new Google_Config();
$google_config->setLoggerClass('Google_Logger_File');
$google_config->setClassConfig('Google_IO_Curl', 'options',
  array(
    CURLOPT_VERBOSE => TRUE,
  )
);
$google_client = new Google_Client($google_config);

您可以在输出中看到使用的 IP 版本。比较:

* About to connect() to www.googleapis.com port 443 (#0)
*   Trying 74.125.136.95... * connected

与:

* About to connect() to www.googleapis.com port 443 (#0)
*   Trying 2a00:1450:4013:c01::5f... * connected

通过 Google 搜索找到了这个问题,因为我遇到了完全相同的问题。 crontab 中的脚本昨天开始失败,出现“操作在 100000 毫秒后超时,收到 0 个字节”错误。虽然有些运行成功,但我仍然不能 100% 确定原因。我已经像上面解释的那样强制使用 IPv4,到目前为止没有看到新的错误。

关于php - 进行可恢复上传时出现 CURL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33354163/

有关php - 进行可恢复上传时出现 CURL 问题的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  4. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  5. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  6. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  7. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  8. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  9. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  10. ruby - 如何进行排列以有效地定制输出 - 2

    这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][

随机推荐