很多人遇到这个问题,php在windows 64下的curl功能,要么扩展无法加载,要么即是加载了也无法使用,这都好几年了,还有人遇到,也没人说道说道,我就说道说道,免得还有人继续踩坑。
我们都知道,PHP不是跨平台的语言。这点一定要搞清楚(要人说,PHP官方和PHP大鸟都说PHP是跨平台的,呵呵。。)
实际上是这样的,PHP早期对 win 64位一直支持都不好,包括不支持超过4G的大文件,不支持2037年之后的日期。。PHP官方从开始支持win 64 的版本5.4开始也一直在强调
The x64 builds of PHP 5 for Windows are experimental, and do not provide 64-bit integer or large file support.
PHP 7 provides full 64-bit support.The x64 builds of PHP 7 support native 64-bit integers, LFS, memory_limit and much more.
可见,直到PHP7,官方才口头上宣布完全支持win 64环境。实际上呢?
自从win 64诞生以来,每个PHP版本的curl类库都存在问题,要么显示Call to undefined function curl_init()错误,要么运行后得不到预期效果。具体表现就是PHP显示curl扩展已加载,并且一些简单需求CURL也能正常工作。但是一些复杂点的应用,比如上传文件实现不了。网上很多文章提到
将libeay32.dll、ssleay32.dll 、php_curl.dll 这几个文件放在C:\WINDOWS\system32目录和syswow64这个文件夹下,并屏蔽php.ini里的curl扩展(有说要屏蔽的,有说不要的)
然而很多场景下,这样的办法并没效。到底是什么原因导致PHP的这个bug都5,6年了还没解决呢?其实主要原因就在于PHP不是跨平台的语言,也不提倡跨平台,所以PHP开发组没有测试不同平台下功能是否一致。
老外不迷信,所以老外的博客很早就有PHP 5.3和5.4,以及 5.5的解决办法
http://www.technoreaders.com/code/curl-on-wamp/
http://www.anindya.com/php-5-4-3-and-php-5-3-13-x64-64-bit-for-windows/
把老外重新编译的dll文件替换官方的dll文件,重启就好了。如果是PHP 5.6以上的版本呢?那呵呵哒,如果恰好你不幸遇到了,那么换linux吧。。酱紫。
记住:如果你的代码在win 64下curl使用达不到效果,别怀疑自己,这是PHP本身的问题。
测试代码:
<?php
function curlUpload($filename, $path='') {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://image.baicai.me/pic.html'); //测试用例
$file = realpath($filename);
$type = mime_content_type($file);
$pathi = pathinfo($file);
curl_setopt($ch, CURLOPT_POST, 1);
$fileds=[];
if (class_exists('\CURLFile')) {
$fields = array('fieldNameHere' => new \CURLFile(realpath($file),$type,$pathi['basename']),'path'=>$path);
} else {
$fileds = array('fieldNameHere' => "@{$file};type={$type};filename={$pathi['basename']}",'path'=>$path);
}
curl_setopt($ch, CURLOPT_POSTFIELDS, $fileds);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
$ret = curl_exec($ch);
curl_close($ch);
return $ret;
}
$ret= curlUpload('g:/1/mm.jpg');
var_dump($ret);
以上代码在任意linux下均正确执行,并与预期相符。在任何WIN64环境下,文件均无法上传,包括最新PHP 7。如果你测试有不同结果,欢迎留言.