不同版本PHP之间cURL的区别(-经验之谈),不同版本curl_PHP教程
不同版本PHP之间cURL的区别(-经验之谈),不同版本curl
之前在做一个采集的工具,实现采集回来的文章,图片保存起来.文章内容是保存在数据库,图片是先需要上传到图片服务器,再返回图片地址,替换掉文章的图片地址.
问题来了:都能成功采集都东西,但是,本地测试是正常的,图片也可以上传成功,但是生产环境就是一直没有图片.然后自己就一步一步调试,,发现数据都有,但为什么偏偏生产上没有成功上传图片呢.
后来折腾了几天,经过一步步的看代码,调试,百度,终于找到答案了.真是一个大坑.
上传到图片服务器是用curl post过去的,
PHP的cURL支持通过给CURL_POSTFIELDS
传递关联数组(而不是字符串)来生成multipart/form-data
的POST请求。
传统上,PHP的cURL支持通过在数组数据中,使用“@
+文件全路径”的语法附加文件,供cURL读取上传。这与命令行直接调用cURL程序的语法是一致的:
<code>curl_setopt(ch, CURLOPT_POSTFIELDS, <span class="hljs-keyword">array( <span class="hljs-string">'file' => <span class="hljs-string">'@'.realpath(<span class="hljs-string">'image.png'), )); equals $ curl -F <span class="hljs-string">"file=@/absolute/path/to/image.png" <url> </span></span></span></span></span></code>
但PHP从5.5开始引入了新的CURLFile类用来指向文件。CURLFile类也可以详细定义MIME类型、文件名等可能出现在multipart/form-data数据中的附加信息。PHP推荐使用CURLFile替代旧的@
语法:
<code>curl_setopt(ch, CURLOPT_POSTFIELDS, [ <span class="hljs-string">'file' => <span class="hljs-keyword">new CURLFile(realpath(<span class="hljs-string">'image.png')), ]); </span></span></span></code>
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这个两者都支持过渡版本上,结果就是必须写出带有环境判断的两套代码。
现在问题来了……
环境判断:小心魔法数字!
我见过这种环境判断的代码:
<code><span class="hljs-keyword">if (version_compare(phpversion(), <span class="hljs-string">'5.4.0') >= <span class="hljs-number">0) </span></span></span></code>
我对这种代码的评价只有一个字:屎。
这个判断掉入了典型的魔法数字陷阱。版本号莫名其妙的出现在代码之中,不查半天PHP手册和更新历史,很难明白作者被卡在了哪个功能的变更上。
代码应该回归本源。我们的实际需求其实是:有CURLFile就优先采用,没有再退化到传统@
语法。那么代码就来了:
<code><span class="hljs-keyword">if (class_exists(<span class="hljs-string">'\CURLFile')) { <span class="hljs-variable">$field = <span class="hljs-keyword">array(<span class="hljs-string">'fieldname' => <span class="hljs-keyword">new \CURLFile(realpath(<span class="hljs-variable">$filepath))); } <span class="hljs-keyword">else { <span class="hljs-variable">$field = <span class="hljs-keyword">array(<span class="hljs-string">'fieldname' => <span class="hljs-string">'@' . realpath(<span class="hljs-variable">$filepath)); } </span></span></span></span></span></span></span></span></span></span></span></span></span></code>
建议明确指定的退化选项
从可靠的角度,推荐指定CURL_SAFE_UPLOAD
的值,明确告知php是容忍还是禁止旧的@
语法。注意在低版本PHP中CURLOPT_SAFE_UPLOAD
常量本身可能不存在,需要判断:
<code><span class="hljs-keyword">if (class_exists(<span class="hljs-string">'\CURLFile')) { curl_<span class="hljs-built_in">setopt(<span class="hljs-variable">$ch, CURLOPT_SAFE_UPLOAD, <span class="hljs-literal">true); } <span class="hljs-keyword">else { <span class="hljs-keyword">if (defined(<span class="hljs-string">'CURLOPT_SAFE_UPLOAD')) { curl_<span class="hljs-built_in">setopt(<span class="hljs-variable">$ch, CURLOPT_SAFE_UPLOAD, <span class="hljs-literal">false); } } </span></span></span></span></span></span></span></span></span></span></span></code>
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
明确指定顶层空间,防止代码包裹在命名空间内的时候崩掉。
好了,这坑挖得好深,跳出来就分享下.
(以上解决方法是转载网站的,感谢让我找到了你这篇东西!)

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Dalam Php8, ungkapan perlawanan adalah struktur kawalan baru yang mengembalikan hasil yang berbeza berdasarkan nilai ungkapan. 1) Ia sama dengan pernyataan suis, tetapi mengembalikan nilai dan bukannya blok pernyataan pelaksanaan. 2) Ekspresi perlawanan secara ketat (===), yang meningkatkan keselamatan. 3) Ia mengelakkan kemungkinan ketinggalan dalam penyataan suis dan meningkatkan kesederhanaan dan kebolehbacaan kod.

H5. Perbezaan utama antara program mini dan aplikasi ialah: Senibina Teknikal: H5 adalah berdasarkan teknologi web, dan program mini dan aplikasi adalah aplikasi bebas. Pengalaman dan Fungsi: H5 adalah ringan dan mudah digunakan, dengan fungsi terhad; Program mini adalah ringan dan mempunyai interaktif yang baik; Aplikasi berkuasa dan mempunyai pengalaman yang lancar. Keserasian: H5 adalah serasi, aplikasinya dan aplikasinya yang serasi dengan platform. Kos Pembangunan: H5 mempunyai kos pembangunan yang rendah, program mini sederhana, dan aplikasi tertinggi. Senario yang berkenaan: H5 sesuai untuk paparan maklumat, applet sesuai untuk aplikasi ringan, dan aplikasi sesuai untuk fungsi kompleks.

Dalam PHP, anda boleh mencegah serangan CSRF dengan menggunakan token yang tidak dapat diramalkan. Kaedah khusus termasuk: 1. Menjana dan membenamkan token CSRF dalam bentuk; 2. Sahkan kesahihan token semasa memproses permintaan.

Eksport PDF yang dilindungi kata laluan di Photoshop: Buka fail imej. Klik "Fail" & gt; "Eksport" & gt; "Eksport sebagai PDF". Tetapkan pilihan "Keselamatan" dan masukkan kata laluan yang sama dua kali. Klik "Eksport" untuk menghasilkan fail PDF.

Jenis yang ketat dalam PHP didayakan dengan menambah mengisytiharkan (strict_types = 1); di bahagian atas fail. 1) Ia memaksa jenis pemeriksaan parameter fungsi dan pulangan nilai untuk mengelakkan penukaran jenis tersirat. 2) Menggunakan jenis yang ketat dapat meningkatkan kebolehpercayaan dan kebolehprediksi kod, mengurangkan pepijat, dan meningkatkan kebolehkerjaan dan kebolehbacaan.

Keperluan mendaftarkan vuerouter dalam fail index.js di bawah folder penghala apabila membangunkan aplikasi VUE, anda sering menghadapi masalah dengan konfigurasi penghalaan. Khas ...

Dalam PHP, kata kunci akhir digunakan untuk mencegah kelas daripada diwarisi dan kaedah ditimpa. 1) Apabila menandakan kelas sebagai muktamad, kelas tidak boleh diwarisi. 2) Apabila menandakan kaedah sebagai muktamad, kaedah itu tidak boleh ditulis semula oleh subkelas. Menggunakan kata kunci akhir memastikan kestabilan dan keselamatan kod anda.
