首页
关于
联系我
Search
1
win11不能访问共享0x800704f8
132 阅读
2
小米路由器4A千兆版(R4A) 关闭ipv6 防火墙
130 阅读
3
小米路由器4A千兆版(R4A)开启ssh
119 阅读
4
华硕主板vga亮白灯
54 阅读
5
z-library最新地址
54 阅读
未分类
各种资料
我的分析
技术活
游记
真相
笔记
经历
财务知识
资源类
软文
统计学
计划本
事件记录
反思
登录
Search
标签搜索
问题
linux
vps
debian
测试
其他
apt-get
库
wordpress
cdn
code
设置
信息
IP
nginx
应用
推荐
搬家
操作
bae
Typecho
累计撰写
493
篇文章
累计收到
0
条评论
首页
栏目
未分类
各种资料
我的分析
技术活
游记
真相
笔记
经历
财务知识
资源类
软文
统计学
计划本
事件记录
反思
页面
关于
联系我
搜索到
4
篇与
的结果
2015-07-28
PHP 5.0~5.6 各版本兼容性的 cURL 文件上传
最近在搞一个针对sm.ms 图片站的上传插件,然后就遭遇curl 坑,也不知道是年龄大了,还是PHP 真的越来越麻烦了。转载一篇文章,作为备注吧最近做的一个需求,要通过PHP调用cURL,以multipart/form-data格式上传文件。踩坑若干,够一篇文章了。重要警告没事不要读PHP的官方中文文档!版本跟不上坑死你!不同版本PHP之间cURL的区别PHP的cURL支持通过给CURL_POSTFIELDS传递关联数组(而不是字符串)来生成multipart/form-data的POST请求。传统上,PHP的cURL支持通过在数组数据中,使用“@+文件全路径”的语法附加文件,供cURL读取上传。这与命令行直接调用cURL程序的语法是一致的:curl_setopt(ch, CURLOPT_POSTFIELDS, array( 'file' => '@'.realpath('image.png'), )); equals $ curl -F "file=@/absolute/path/to/image.png" <url> 但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以详细定义MIME类型、文件名等可能出现在multipart/form-data数据中的附加信息。PHP推荐使用CURLFile替代旧的@语法:curl_setopt(ch, CURLOPT_POSTFIELDS, [ 'file' => new CURLFile(realpath('image.png')), ]); PHP 5.5另外引入了CURL_SAFE_UPLOAD选项,可以强制PHP的cURL模块拒绝旧的@语法,仅接受CURLFile式的文件。5.5的默认值为false,5.6的默认值为true。但是坑的一点在于:@语法在5.5就已经被打了deprecated,在5.6中就直接被删除了(会产生 ErorException: The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead)。对于PHP 5.6+而言,手动设置CURL_SAFE_UPLOAD为false是毫无意义的。根本不是字面意义理解的“设置成false,就能开启旧的unsafe的方式”——旧的方式已经作为废弃语法彻底不存在了。PHP 5.6+ == CURLFile only,不要有任何的幻想。我的部署环境是5.4(仅@语法),但开发环境是5.6(仅CURLFile)。都没有压在5.5这个两者都支持过渡版本上,结果就是必须写出带有环境判断的两套代码。现在问题来了……(挖掘机滚远点!)环境判断:小心魔法数字!我见过这种环境判断的代码:if (version_compare(phpversion(), '5.4.0') >= 0) 我对这种代码的评价只有一个字:屎。这个判断掉入了典型的魔法数字陷阱。版本号莫名其妙的出现在代码之中,不查半天PHP手册和更新历史,很难明白作者被卡在了哪个功能的变更上。代码应该回归本源。我们的实际需求其实是:有CURLFile就优先采用,没有再退化到传统@语法。那么代码就来了:if (class_exists('\CURLFile')) { $field = array('fieldname' => new \CURLFile(realpath($filepath))); } else { $field = array('fieldname' => '@' . realpath($filepath)); } 建议明确指定的退化选项从可靠的角度,推荐指定CURL_SAFE_UPLOAD的值,明确告知php是容忍还是禁止旧的@语法。注意在低版本PHP中CURLOPT_SAFE_UPLOAD常量本身可能不存在,需要判断:if (class_exists('\CURLFile')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); } else { if (defined('CURLOPT_SAFE_UPLOAD')) { curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); } } cURL选项设置的顺序不管是curl_setopt()单发还是curl_setopt_array()批量,cURL的选项总是设置一个生效一个,而设置好的选项立刻就会影响cURL在设置后续选项时的行为。例如CURLOPT_SAFE_UPLOAD就和CURLOPT_POSTFIELDS的行为有关。如果先设置CURLOPT_POSTFIELDS再设置CURLOPT_SAFE_UPLOAD,那么后者的约束作用就不会生效。因为设置前者时cURL就已经把数据实际的识读处理完毕了!cURL有那么几个选项存在这种坑,务必小心。还好这种存在“依赖关系”的选项不多,机制也不复杂,简单处理即可。我的方法是先批量设置所有的选项,然后直到curl_exec()的前一刻才用curl_setopt()单发设置CURLOPT_POSTFIELDS。实际上在curl_setopt_array()用的数组中,保证CURLOPT_POSTFIELDS的位置在后边也是可靠的。PHP的关联数组是有顺序保障的,我们也可以假设curl_setopt_array()内部的执行顺序一定是从头到尾按顺序[注A],所以尽可放心。我的做法只是在代码表现上加个多余的保险,突出强调顺序的重要性防以后手贱。命名空间PHP 5.2或以下的版本没有命名空间。代码中用到了空间分隔符\就会引发解析器错误。要照顾PHP 5.2其实容易想,放弃命名空间即可。要注意的反倒是有命名空间的PHP 5.3+。无论是调用CURLFile还是用class_exists()判断CURLFile的存在性,都推荐写成\CURLFile明确指定顶层空间,防止代码包裹在命名空间内的时候崩掉。
2015年07月28日
2 阅读
0 评论
0 点赞
2013-03-13
尼玛,又是医药类链接
今天alivv 狂给我信息,登录一看,尼玛,全是治疗怪病的链接,我又迷茫了,我是挂呢还是不挂呢,挂,拉不下脸,不挂,我需要钱,没钱我咋续费网站,咋维持生存呢?哎,我妥协了。还是发个文章,给大家说明下,注意了,注意了,alivv 推荐栏里的链接,大家不要点,据我所知,治愈率极低,看病还是上正规大医院。
2013年03月13日
14 阅读
0 评论
0 点赞
2012-11-21
关于推广链接
事情还得从我得到个阿里云代金券说起,因为得到的多,所以就没用,看到群里有个人在哪里要代金券,顺手就给了,并且发了我的推荐链接。当时自己的想法是想顺便赚个推介费。这事也就过去了晚上看阿里云账户,顺手点开推荐看了下,哎,那个叫校长的家伙竟然没通过我的链接注册,哎,这让我感觉很是失落。自己多少对于自己送代金券的行为感觉傻了。劈开具体的事情,说说。推广链接这东西就是别人通过介绍或者其他方式向你推销,你买到产品,他赚了提成,有点像现在的传销或者是保险。但这种行为本身并不违法,挺正常的商业手段,你不会因为点了推广链接你就损失什么?你只是获得了信息,而别人却能通过推荐链接获得提成。感觉这样的解释挺绕口的还是用现实中的事情来解释吧,就像我是保险推销员,给你推荐保险,你买保险了,我获得了提成。这样的商业行为,貌似也没啥问题。其实自己在看到别人的推广链接的时候,也总是手动去掉尾巴,不想给别人赚推介费。有时也在想自己干嘛要这样,别人提供了信息,自己购买还便宜了,再说别人赚推荐费自己也不用多掏钱,想想是互利的,但为什么就是不愿意点呢,而是费力的去掉推荐链接???一直没细细的思考这个问题,直到几天我才正式想了想,我想大概是人性的问题吧,像打麻将,我不糊你也别想胡,看不得人赚钱。更别想利用我赚钱(权当是利用吧)。细想下这个其实多少有点问题,这其实是互惠的行为,你购买了,说明你需要,而我通过向你介绍获得了提成。这种行为并不会损害到哪一方。相反的,如果我推荐了,写了好多说明,还提供了优惠码,代金券,你用我的优惠码、代金券省了不少钱,而我想得到的推介费却没有,那肯定会像我这样失落,感觉自己很傻,出力讨不到好。继续推广开来,好多事情也是这样,同处一地的人,首先想到的是竞争,而不是互助,都是拆台,不想搭台。就是对大家都有利,这个台也不会便宜你。类似事情好多啊,比如你好心告诉别人个消息,别人竟然没搭理你,你好心去扶老太太,却被老太太讹上了…………既然知道缘由了,抱怨是无用的,还是找解决问题的办法,看到的办法有1:放弃不做。这不是解决问题啊。2:曲线救国,制造麻烦,这只能说是次办法,但是挺解决问题,耽误你我的时间。自己想想也没想到什么好办法,只能是这样。弄个短链接,隐藏推荐网址,尽量把推荐引导到网站,增加获取难度。其他的事情也是这样,不采用直接手段,曲里拐弯转着来。哎,想想多可悲,由于人性,效率降低了很多。顺便深深地鄙视下此人,出口恶气:校长 6889412
2012年11月21日
15 阅读
0 评论
0 点赞
2012-03-07
公共dns
最近运营商的dns老是不稳定,推荐几个公共dnsCNNIC 提供的dns210.2.1.1210.2.2.2 114dns提供的114.114.114.114114.114.115.115google提供的:8.8.8.84.4.4.4
2012年03月07日
15 阅读
0 评论
0 点赞