PHP ve Curl: WordPress nasıl HTTP istekleri yaptı
Curl kütüphanesinin gücü, WordPress ile nasıl çalıştığını ve ne düşünmeniz gerektiğini (özellikle macOS’ta) bilmek istiyorsanız, o zaman doğru yerdesiniz. Curl nedir? Kıvrılın ne olduğunu tartışarak başlayalım. Curl gerçekten iki bölüm, tüm harikaları yapan bir Kütüphane C olan Libcurl ve Curl CLI programı. PHP gibi programlama dilleri, orijinal curl işlevselliği sağlamalarını sağlayan bir modül olarak Libcurl’u içerir. Libcurl Kütüphanesi, açık kaynaklı URL transferinin bir kütüphanesidir ve çeşitli protokolleri destekler. Sadece HTTP değil, HTTPS, SCP, SFTP, HTTP/2, HTTP/3 ve hatta Gopher. Hayal edebileceğiniz hemen hemen tüm protokoller – Curl’u destekleyin.
Curl 1998’den beri var ve 2021’de 23 yaşında, neredeyse çeyrek yüzyıl!Ancak hala oldukça güçlü ve modern ve işaretleri yavaşlatmadan çok aktif bir gelişmede.Bir tuhaflık ve soruna sahip olmasına rağmen, bu geliştiricilerin nasıl çalıştığını ve işlevlerini öğrenmeleri için yararlıdır.”Tamam Pete, güzel.Bu kıvrılmayı seviyorsun, neden öğrenmeliyim? “Bazı iyi nedenler var!Bunun nedeni kıvrımın düzgün olması ve çok temiz demek.Bu bir İnternet İsviçre ordu bıçağı gibi.Temel olarak, ağ istekleri yapması gereken yazılımlarınız varsa – uzun mesafeli URL’lere veya SFTP -CURL dosya indirmeleri için HTTP yayın istekleri olsun, genellikle en kolay seçimdir.
Örneğin, dosya yüklemeleriyle HTTP Post istekleri göndermek için Curl CLI kullanın, çalıştırın: curl-form adı = Peter-form Age = 34-form [e-posta korumalı] /kullanıcılar/petertasker/fotoğraflar/görüntüler- 1. Jpg http://httpbin.org/post büyük dosyaları indirmeye ne dersiniz? Curl -o http://ftp.gnu.org/pub/gnu/libiconv/libiiconv -1.14.tar.gz veya sunucudan http başlığı mı alın? Curl -i http: Server: Nginx Tarih: Thu, 11 Mar 2021 14:56:01 GMT içerik -type: text/html; Charset = UTF-8 Vary: Kabul kodlayan bağlantı: ; Rel = “https://api.w.org/” bağlantı: ; Rel = “alternatif”; type = “Application/json” bağlantısı: ; Rel = ShortLink X-Frame-Options: Sameorigin X-Content-Type-Opations: Nosniff X-XSS koruma: 1; Mode = Block İçerik-Security-Polisy: Varsayılan SRC ‘Self’ HTTPS: Veri: WSS: ‘Güvenli Olmayan Çevir’ ‘Güvenli Olmayan Eval’; Yönlendirici-Policy: Origin-Cross-Origin, Sıkı Origin-Cross-Origin Fastcgi-Cache: Curl’un öğrenme için uygun olmasının ikinci nedeni, hemen hemen tüm platformlarda mevcut olması ve hızlı ve kolay bir şekilde kurulabilmesidir. . Bir web sunucunuz varsa, bir kıvrınız olabilir.
Örneğin, macOS’a Curl yüklemediyseniz, çalışarak bir homebrace ile hızlı bir şekilde alabilirsiniz: şimdiye kadar kuru kurma kurma, curl, CLI araçları gördük, ancak PHP dahil çoğu dil için curl bağlanması da mevcuttur. . Ağ istekleri yapan PHP yazılımı kullanıyorsanız, Curl kullanabilirsiniz! PHP Land’de Curl ve PHP, MySQLI veya GD Kütüphanesi gibi güvenebileceğiniz diğer modüller gibi kıvrılma desteği. Çoğu PHP versiyonu varsayılan olarak buklelerle derlenir, ancak Curl’un teknik olarak entegrasyonu, MySQLI ve phpinfo çıkışınızın uzatılmasında listelenen diğer tüm şeylerdir: PHP Curl uygulaması, biraz istenen bırakır. . Curl CLI araçları nispeten kolay olsa da, PHP uygulaması biraz daha karmaşıktır. Curl’ın PHP uygulamasıyla çalışırken, curl_setopt () işlevini kullanmanız gerekir. Bu işlev, kıvrım seçeneğini ayarlamanızı sağlar. Örneğin, HTTP Post isteğinin hazırlanması şuna benziyor: $ curl = curl_init (‘https://httpbin.org/post’); curl_setopt ($ curl, curlopt_post, true); curl_setopt ($ curl, curlopt_postfields, dizi (‘field1’ => ‘bazı veri’, ‘field2’ => ‘bazı daha fazla veri’)); curl_setopt ($ curl, curlopt_rettransfer, true); $ tepkisi = curl_exec ($ curl); curl_close ($ curl); Kötü olmasa da, bu şekilde istekte bulunmak daha büyük talep ve daha karmaşık curlopt_ parametreleri ile biraz kontrolden çıkabilir. Neyse ki, olağanüstü PHP topluluğu çok fazla karmaşıklığı ortadan kaldıran bir kütüphane yarattı. Daha popüler ağ kütüphanelerinden ikisi guzlama ve isteklerdir. Talep daha uzun PHP sürümünü desteklediğinden ve WordPress tarihsel olarak çok uzun bir PHP sürümünü (😩) desteklediğinden, istek kütüphanesi WordPress çekirdeğinde kullanılır. WordPress’te dahili olarak kıvrılan WordPress, ağ istekleri için WP_HTTP sınıfını kullanır ve bu da istek kütüphanesine bağlıdır. Bu, wp_remote_get () ve wp_remote_post () gibi tüm HTTP yardımcı program yöntemlerinin istekleri kullandığı anlamına gelir. Yüksek seviyelerde, WordPress güncellemeleri, eklenti indirmeleri, eklenti yenilemesi ve neredeyse tüm WordPress’in çekirdeğindeki yükleme/indirme işlevlerini bağdan ve kıvrılış seçeneğinden isteğe bağlı olarak yükleyin. . WP-Incomudes/class-http.php açarsanız, WordPress’te HTTP isteklerini teşvik eden birçok dahili kanal görebilirsiniz. WordPress 4.6’da wp_http :: request (); Bu yöntem, :: request () ‘i istek yöntemini kullanır. WordPress 5.7’de, bu çağrıyı yukarıda atıfta bulunulan WP_HTTP sınıfından 394 satırında bulabilirsiniz. $ request_response = requests :: request ($ url, $ başlıklar, $ data, $ type, $ options); Oldukça basit değil mi? Şimdi aşağıdaki HTTP gönderisinin isteğini yukarıdaki RAW Curlopts yöntemi ile karşılaştırın:
$ data = Array (‘Key1’ => ‘değer1’, ‘Key2’ => ‘değer2’); $ tepki = istek :: post (‘http://httpbin.org/post’, array (), $ data); Çok daha basit. Ve eklentiler veya WordPress temaları bağlamında çalışıyorsanız, daha fazla soyutlama için wp_remote_post () işlevini kullanabilirsiniz: $ data = array (‘Key1’ => ‘değer1’, ‘Key2’ => ‘değer2’); $ Response = wp_remote_post (‘http://httpbin.org/post’, dizi (‘veri’ => $ veri)); Şimdi konuşuyoruz! WP_REMOTE_POST (), yöntemin bir parametresi olarak Post ile WP_http :: Request () ‘yi arayın. Şimdi, istek dahili olarak çalıştığı sürece, WP-Includes/Class-Requests’e bakalım, kodun ilk baktığını görelim. $ Transport seçeneği için. WordPress isteklerinin uygulanmasında, bu sırayla yalnızca 2 varsayılan, kıvrım ve fsockopen seçenekleri vardır. Fsockopen, PHP akışı kullanır ve kıvrılma uzantısı takılmadığında bir rezervtir. … if (! boş ($ options [‘aktarım’])) {$ tanıtım = $ options [‘aktarım’]; if (is_string ($ options [‘aktarım’]))) {$ tanıtım = new $ aktarım (); }} else {$ need_ssl = (0 === Stripos ($ url, ‘https: //’)); $ özelliği = Array (‘ssl’ => $ need_ssl); $ tanıtım = self :: get_transport ($ özellikleri); } $ tepki = $ aktarım-> isteği ($ url, $ başlıklar, $ data, $ options); … Taşıma belirlendikten sonra, istek seçilen $ nakliye sınıfına iletilir. Bu makaledeki kıvrımı tartıştığımız için, isteğin kıvrılmayı nasıl kullandığını hemen kontrol edeceğiz.
WP-Incomudes/Requests/Transport/Curl.php satır 130 çevresinde çok altında, isteğin gerçekten nasıl çalıştığını göreceğiz. Bu sınıf, PHP’de Curl ile ne kadar karmaşık çalıştığını vurgular. Sınıf mantığı çoğu, isteği ve yanıt üstbilgisini doğrulamak ve işlemek ve yönteme iletilen parametrelere göre doğru curloptları ayarlamakla ilgilidir. Birçok parametre ayarı ayrıca 309 satırındaki Requests_transport_Curl Method :: setup_handler () ‘de devam eden seçenekleri yönlendiren ve doğru curlopt_: … anahtar ($ options [‘ type ‘]) {vaka istekleri: Gönderi: CURL_SETOPT ($ this-> tutamak, curlopt_post, true); curl_setOpt ($ this-> tutamak, curlopt_postfields, $ data); kırmak; Vaka istekleri :: kafa: curl_setopt ($ this-> tutamak, curlopt_customRequest, $ options [‘type’]); curl_setopt ($ this-> tutamak, curlopt_nobody, true); kırmak; Vaka istekleri :: Trace: curl_setOpt ($ this-> tutamak, curlopt_customRequest, $ options [‘type’]); kırmak; Vaka istekleri :: Patch: vaka istekleri :: Put: vaka istekleri :: silge: vaka istekleri :: Seçenekler: varsayılan: curl_setopt ($ this-> tetik, curlopt_customRequest, $ options [‘type’]); if (! boş ($ data)) {curl_setopt ($ this-> the, curlopt_postfields, $ data);
}} … Sonunda, tüm seçenekler ayarlandıktan sonra tüm bunlar curl_exec () çağrı üzerinde kaynar. Karmaşık görünüyorsa, çünkü öyle! Farklı sunucular ve ana bilgisayarların HTTP başlıkları ve SSL kullanımı için farklı gereksinimleri vardır. Çeşitli düzenlemeleri karşılamak için iyi işler yapma talepleri. Buna ek olarak, WordPress Network işlevinde, curl seçeneğinin gerekirse değiştirilmesini sağlayan birkaç kanca vardır. Örneğin, yerel geliştirme ortamımda Mu-Plugin hakkında aşağıdaki yorumlara sahibim: add_action (‘http_api_curl’, function ($ tutma) {// SSL certs curl_setopt ($ tine, curlopt_ssl_verifypeer, false); curl_setopt (curl_setopt doğrulamayın $ tute ($ tutma), curlopt_ssl_Verifyost, false); // Charles HTTP proxy curl_setopt ($ handle, curlopt_proxy, “127.0.0.1”); curl_setopt ($ tutma, curlopt_proxyport, 8888);};}; Yukarıdaki örnekte, önce SSL sertifikasının doğrulanmasını devre dışı bırakmak için HTTP_API_CURL kancasını kullanıyorum. Bu, kendiniz imzalanmış bir sertifikaya sahip bir geliştirme sitesi ile çalıştığınızda, doğrulanması gerekmeyen kullanışlıdır. Notlara ek olarak, ana bilgisayar doğrulamasını devre dışı bırakmak için Curl seçeneğini bir kenara bırakmanın iyi bir alternatifi, yerel sunucunuz için kendi sertifika otoritenizi oluşturmaktır. İkinci blok, kabloyu geçtiklerinde PHP ağ isteğini kontrol etmek için Charles aracılığıyla bir proxy yapmama izin verdi. Charles, yerel ortamınızdaki her bir talebin giriş ve çıkışlarının ayrıntılarını görmenizi sağlayan ağ istekleri istemek için olağanüstü bir araçtır.
WordPress’teki curl’u nasıl güncellerim? Yapmıyorsun. WordPress’in kendi curl kütüphanesi yoktur, ancak PHP kurulumu tarafından sağlanan curl sürümüne bağlıdır. Ve PHP Curl uzantısı bir Libcurl ambalajıdır ve sunucuya yüklenen Libcurl sürümünü kullanır. Bu nedenle, WordPress için Curl’u güncellemek neredeyse her zaman web sunucusundaki kıvrımı güncellemekle aynıdır. Kendiniz yönetmedikçe, bu sunucu yöneticisine veya barındırma şirketine size yardımcı olmasını istemeniz gereken bir şeydir. Kendi Ubuntu sunucunuzu yönetirseniz, en son Libcurl sürümünü alabilirsiniz: SUDO APT Update Sudo Apt Yükseltme Sizi hala modası geçmiş bir kıvrım sürümü ile bırakırsa, Ubuntu’yu güncellemeniz gerekebilir. Bu yazının kapsamı biraz ötesinde, ancak kıvrılmanın güncel olmayabileceği işaretlerini tanımak iyidir. Sunucunuzdaki Curl sürümünün çok eski olduğunun en belirgin işareti, WordPress’in HTTPS aracılığıyla uzun mesafeli bir sunucuya bağlanamayacağıdır. Aranması gereken hata mesajı Curl Hatası 60’dır. Bu hata, Curl’un SSL sertifikalarını uzun mesafeli ana bilgisayarlardan doğrulayamadığı anlamına gelir. Bu, sisteminize sona eren kök sertifikalarının bir listesinden kaynaklanabilir. Mevcut Curl sürümünüzü WordPress Yönetici Gösterge Tablosu’ndan kontrol etmek için Araçları Aç → Site Sağlığı → Bilgi:
Curl sürümünüzü bir Curl sürümleri listesiyle karşılaştırın. 3 yıldan fazla bir süre geçtiyse, yükseltmek iyidir. 2017’den daha uzunsa, 23 Mart 2021’den itibaren birkaç Amazon hizmetine bağlanırken sorunlar yaşayabilirsiniz. ve SSL birlikte çalışır. OpenSSL, şifreli iletişimi işlemek için bir SSL/TLS TLS Toolkit Endüstriyel Standartlarıdır. Curl gibi, bu başka bir yazılım kütüphanesidir. Curl, TLS protokolü aracılığıyla bağlantı kurmak için SSL/TLS araç seti ile derlenir. WP Migrate DB Pro durumunda, yüklü bir SSL sertifikası (HTTPS sitesi) olan bir siteden itmeye veya ilginç olmaya çalıştığınızda gerçekleşecektir. Curl OpenSSL ile derlenmediğinde macOS’ta sorunlar ortaya çıkabilir. SSL’nin kıvrımla işlenmesi çok büyük bir konudur (bu sorunla ilgili destek belgeleri yazdık), ancak macOS ile sorun genellikle Securetransport adı verilen farklı bir SSL/TLS kütüphanesidir. Bu, MAC bilgisayarlarıyla ilgili sorunlara neden olurdu, çünkü Apple’ın Securetransport, openSl kadar hızlı gerekli SSL/TLS özelliklerini uygulamadı. Örneğin, Apple, 2018’de HTTP/2 protokolüne destek dahil olmak üzere OSX/High Sierra’ya (10.13.4) götürüyor. Bu, Mac’te yerel gelişim için sorunlara neden olabilir. Durum şimdi çok daha iyi, ancak yerel ulaşım Vs. SSL seni ısırabilir.
PHP tarafından hangi OpenSSL sürümünün kullanıldığını görmek için iyi bir test, dizenin ‘SSL’ sürümü için phpinfo çıkışını aramak için grep kullanmaktır. PHP -i | Grep “SSL Sürümü” Çıktıda, OpenSSL veya SecureTransport kullanıp kullanmadığınızı göreceksiniz. # Ubuntu 20.04: ssl sürüm => openssl/1.1.1i # macOS 11.2.1/big Sur SSL sürüm => (Securetransport) Openssl (hangi sevdiğimiz) kullanarak ubuntu geliştirme sunucusu için PHP, PHP, PHP Ama Mac’te PHP çevirmenleri kullanıyorum, OpenSSL’ye bağlanarak Apple’ın Securetransport’u kullanıyorum (bu yüzden iyi olacak). Fakat bekle! Curl ve macOS ile bir şey daha var. Mac’imde CLI Curl Aracının bildirdiği şeye yakından dikkat edin: Curl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (Securetransport) libressl/2.8.3 zlib/1.2.11 nghhttp2/1.41.0 Sürüm-Tarih: 2019-03-27 Protokoller: DICT DOSYA FTP FTPS Gopher HTTPS IMAPS LDAP LDAPS POP3S POP3S RTSP SMB SMTPS TFTP TFTP Özellikleri: Asynchdns GSS-Api HTTPS-proksi Ipv6 Unxicocks Curl Cliants Supe Supetting SSL’yi ele almak için başka bir kütüphane olan Libress’e bağlanma süresi. Burada dikkat edilmesi gereken ilginç şey, Mac’te PHP’deki Curl ve komut satırındaki Curl’un SSL’yi işlemek için farklı bir kütüphane kullanabileceğidir.