【问题标题】:PHP: How to make curl with system()/exec() work always?PHP:如何使用 system()/exec() 使 curl 始终工作?
【发布时间】:2018-06-15 06:20:25
【问题描述】:

我们网络服务器上的 PHP 版本较旧,并且在 curl 调用中不支持 TLSv1.2。所以我想用system()/exec() 打一个 curl 电话。

这有时有效,但有时无效。

失败时没有错误。然后参考这个建议 - https://stackoverflow.com/a/539030/1278063 我在命令末尾添加了 2>&1 以将错误从 stderr 重定向到 stdout。 下面是示例代码-

<?php
    $cmd = sprintf('curl -X POST %s --tlsv1.2 2>&1', escapeshellarg($url));
    $sysout = exec($cmd,$output,$ret);
    print_r($output);
?>

代码失败时的输出如下-

Array ( 
    [0] => mkdir: cannot create directory `/usr/bin/.libs': Permission denied 
    [1] => /usr/bin/curl: line 202: cd: /root/curl-7.57.0/src: Not a directory 
    [2] => gcc: curl-slist_wc.o: No such file or directory 
    [3] => gcc: curl-tool_binmode.o: No such file or directory 
    [4] => gcc: curl-tool_bname.o: No such file or directory 
    [5] => gcc: curl-tool_cb_dbg.o: No such file or directory 
    [6] => gcc: curl-tool_cb_hdr.o: No such file or directory 
    [7] => gcc: curl-tool_cb_prg.o: No such file or directory 
    [8] => gcc: curl-tool_cb_rea.o: No such file or directory 
    [9] => gcc: curl-tool_cb_see.o: No such file or directory 
    [10] => gcc: curl-tool_cb_wrt.o: No such file or directory 
    [11] => gcc: curl-tool_cfgable.o: No such file or directory 
    [12] => gcc: curl-tool_convert.o: No such file or directory 
    [13] => gcc: curl-tool_dirhie.o: No such file or directory 
    [14] => gcc: curl-tool_doswin.o: No such file or directory 
    [15] => gcc: curl-tool_easysrc.o: No such file or directory 
    [16] => gcc: curl-tool_formparse.o: No such file or directory 
    [17] => gcc: curl-tool_getparam.o: No such file or directory 
    [18] => gcc: curl-tool_getpass.o: No such file or directory 
    [19] => gcc: curl-tool_help.o: No such file or directory 
    [20] => gcc: curl-tool_helpers.o: No such file or directory 
    [21] => gcc: curl-tool_homedir.o: No such file or directory 
    [22] => gcc: curl-tool_hugehelp.o: No such file or directory 
    [23] => gcc: curl-tool_libinfo.o: No such file or directory 
    [24] => gcc: curl-tool_main.o: No such file or directory 
    [25] => gcc: curl-tool_metalink.o: No such file or directory 
    [26] => gcc: curl-tool_msgs.o: No such file or directory 
    [27] => gcc: curl-tool_operate.o: No such file or directory 
    [28] => gcc: curl-tool_operhlp.o: No such file or directory 
    [29] => gcc: curl-tool_panykey.o: No such file or directory 
    [30] => gcc: curl-tool_paramhlp.o: No such file or directory 
    [31] => gcc: curl-tool_parsecfg.o: No such file or directory 
    [32] => gcc: curl-tool_strdup.o: No such file or directory 
    [33] => gcc: curl-tool_setopt.o: No such file or directory 
    [34] => gcc: curl-tool_sleep.o: No such file or directory 
    [35] => gcc: curl-tool_urlglob.o: No such file or directory 
    [36] => gcc: curl-tool_util.o: No such file or directory 
    [37] => gcc: curl-tool_vms.o: No such file or directory 
    [38] => gcc: curl-tool_writeout.o: No such file or directory 
    [39] => gcc: curl-tool_xattr.o: No such file or directory 
    [40] => gcc: ../lib/curl-strtoofft.o: No such file or directory 
    [41] => gcc: ../lib/curl-nonblock.o: No such file or directory 
    [42] => gcc: ../lib/curl-warnless.o: No such file or directory 
    [43] => gcc: ../lib/.libs/libcurl.so: No such file or directory 
)

为什么代码有时会起作用?如何让它一直工作?

【问题讨论】:

  • 如果您的 PHP 不支持 TLS 1.2,那么您可能运行的版本可能没有任何最近的安全更新,因此可以利用。

标签: php curl


【解决方案1】:

在最新系统上编译静态 curl 库(应该是 ./configure --disable-shared --with-ssl)并将静态 curl 库复制到旧系统,现在 TLS 应该可以正常工作了。但是因为,从个人经验来看,静态编译有时会因各种原因而失败,静默(至少使用 gcc),您应该验证它是静态的,例如ldd ./curl(如果它是静态的,它会抱怨 curl 是静态的,或者打印它尝试加载的库列表。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 2019-11-17
    • 2015-01-27
    • 1970-01-01
    • 2015-12-28
    • 2019-05-05
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多