我有一台通过OpenVPN连接到我公司的服务器,我正在尝试使用PHP的curl命令从另一台服务器检索JSON。
从命令行(php -a)以PHP的交互模式运行最剥离的代码版本,效果很好:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'status.int.companyname.com');
curl_exec($ch);
{...expected json response after 2 seconds}
当我从Apache中运行它时,脚本将挂起。
设置一些超时并输出错误
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
echo 'Error: '.curl_error($ch);
将错误视为
Error: Resolving timed out after 10517 milliseconds
最初我认为这是与DNS相关的问题,但更改URL以使用IP地址或指定要解析的地址
curl_setopt($ch, CURLOPT_RESOLVE, [ 'status.int.companyname.com:80:10.10.0.5']);
yeilded一个连接错误:
Error: Connection timed out after 10001 milliseconds
我的下一个想法是Apache使用了错误的界面。 VPN是默认网关,因此可以正常使用其他所有功能,但我尝试用
强制它curl_setopt($ch, CURLOPT_INTERFACE, '10.33.0.105');
这没有任何区别。在阅读了其他一些帖子之后,我尝试在各种组合中添加以下内容,但没有任何区别。
curl_setopt($ch, CURLOPT_DNS_USE_GLOBAL_CACHE, false);
curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
file_get_contents有同样的问题
我不理解它。命令行上的Curl工作,PHP在交互模式下工作正常。当PHP脚本通过Apache执行时,它不起作用。
我尝试过的其他事情:
Resolv.conf包含一个名称服务器,这是公司VPN
的正确名称服务器CLI和Apache版本的php.ini之间的差异符合预期:
-disable_functions =
+disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
-expose_php = On
+expose_php = Off
-memory_limit = -1
+memory_limit = 128M
有没有人见过这个?我现在已经失去了几天的时间,这让我很生气! 感谢