PHP ve cURL: WordPress HTTP isteklerini nasıl yapar?


cURL, modern internetin beygir gücüdür. Sloganının dediği gibi, cURL, ' url'lerle veri aktarmak ' için kullanılan yardımcı bir yazılım parçasıdır. cURL web sitesine göre, kütüphane her gün milyarlarca insan tarafından arabalardan televizyonlara, cep telefonlarına kadar her şeyde kullanılıyor. İsimsiz NASA projeleri gibi çok ilginç yerler de dahil olmak üzere binlerce uygulama ve hizmetin ağ omurgasıdır.

Ağ üzerinden veri göndermesi veya alması gereken birçok PHP projesi ve kitaplığı, kaputun altındaki varsayılan ağ kitaplığı olarak cURL'yi kullanır. Şaşırtıcı olmayan bir şekilde, WordPress'in İstekler API'sinin yanı sıra eklentilerimizin çoğu WP Migrate DB Pro, WP Offload Media ve WP Offload SES tarafından kullanılan temel bir yardımcı programdır.

cURL kitaplığının gücünü, WordPress ile nasıl çalıştığını ve nelere dikkat etmeniz gerektiğini (özellikle macOS'ta) merak ediyorsanız doğru yerdesiniz.

cURL nedir?

cURL'nin ne olduğunu gözden geçirerek başlayalım. cURL gerçekten iki parçadır, tüm büyüyü yapan C kütüphanesi olan libcurl ve cURL CLI programı. PHP gibi programlama dilleri, cURL işlevselliğini yerel olarak sağlamalarına izin veren bir modül olarak libcurl kitaplığını içerir.

libcurl kitaplığı, açık kaynaklı bir URL aktarım kitaplığıdır ve çok çeşitli protokolleri destekler. Yalnızca HTTP değil, HTTPS, SCP, SFTP, HTTP/2, HTTP/3 ve hatta Gopher. Hemen hemen hayal edebileceğiniz her protokolü – cURL destekler.

cURL 1998'den beri var ve 2021'de 23 yaşına giriyor, çeyrek asra yakın yaşında! Ama yine de oldukça güçlü ve modern ve hiçbir yavaşlama belirtisi olmadan çok aktif bir gelişim içinde. Tuhaflığı ve sorunları olsa da, bir geliştiricinin nasıl çalıştığını ve ne yaptığını bilmesi yararlıdır.

"Tamam Pete, harika" dediğinizi duyabiliyorum. Bu cURL şeyini beğendin, neden öğreneyim?”. Birkaç harika sebep var!

Birinci neden, cURL'nin düzgün olmasıdır ve gerçekten düzgün demek istiyorum. Bir çeşit internet İsviçre çakısı gibi. Esasen, bir ağ isteğinde bulunması gereken bir yazılımınız varsa – ister uzak bir URL'ye HTTP POST isteği isterse bir SFTP dosyası indirmesi olsun – cURL genellikle en basit seçimdir.

Örneğin, cURL CLI'yi kullanarak dosya yüklemeli bir HTTP POST isteği göndermek için şunu çalıştırın:

 curl --form name=Peter --form age=34 --form [email protected]/Users/petertasker/photos/image-1.jpg http://httpbin.org/post

Büyük bir dosya indirmeye ne dersiniz?

 curl -O http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

Veya HTTP başlıklarını bir sunucudan mı alıyorsunuz?

 curl -I https://deliciousbrains.com

HTTP başlıklarını döndürecek olan:

 server: nginx date: Thu, 11 Mar 2021 14:56:01 GMT content-type: text/html; charset=UTF-8 vary: Accept-Encoding link: <https://deliciousbrains.com/wp-json/>; rel="https://api.w.org/" link: <https://deliciousbrains.com/wp-json/wp/v2/pages/28>; rel="alternate"; type="application/json" link: <https://deliciousbrains.com/>; rel=shortlink x-frame-options: SAMEORIGIN x-content-type-options: nosniff x-xss-protection: 1; mode=block content-security-policy: default-src 'self' https: data: wss: 'unsafe-inline' 'unsafe-eval'; referrer-policy: origin-when-cross-origin, strict-origin-when-cross-origin fastcgi-cache: HIT

cURL'nin öğrenmeye değer olmasının ikinci nedeni, hemen hemen her platformda mevcut olması ve hızlı ve kolay bir şekilde kurulabilmesidir. Bir web sunucunuz varsa, muhtemelen cURL'niz de vardır.

Örneğin, macOS'ta önceden yüklü cURL'niz yoksa, aşağıdakileri çalıştırarak Homebrew ile hızlı bir şekilde edinebilirsiniz:

 brew install curl

Şimdiye kadar, CLI aracı olan cURL'ye baktık, ancak cURL bağlamaları PHP dahil çoğu dil için de mevcuttur. Ağ istekleri yapan PHP yazılımı kullanıyorsanız, muhtemelen cURL kullanıyorsunuzdur!

cURL ve PHP

PHP ülkesinde cURL desteği, mysqli veya GD kitaplığı gibi güvenebileceğiniz diğer modüller gibidir.

PHP'nin çoğu sürümü varsayılan olarak cURL ile derlenir, ancak cURL entegrasyonu teknik olarak bir uzantıdır, tıpkı mysqli ve phpinfo() çıktınızın uzantılar bölümünde listelenen diğer her şey gibi:

cURL phpinfo() çıktısı

Ancak PHP'nin cURL uygulaması arzulanan bir şey bırakıyor. cURL CLI aracı nispeten basitken, PHP'nin uygulaması biraz daha karmaşıktır.

PHP'nin cURL uygulamasıyla çalışırken curl_setopt() işlevini kullanmanız gerekir. Bu işlev, cURL seçeneklerini ayarlamanızı sağlar. Örneğin, bir HTTP POST isteği ayarlamak şuna benzer:

 $curl = curl_init( 'https://httpbin.org/post' ); curl_setopt( $curl, CURLOPT_POST, true ); curl_setopt( $curl, CURLOPT_POSTFIELDS, array( 'field1' => 'some data', 'field2' => 'some more data' ) ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); $response = curl_exec( $curl ); curl_close( $curl );

Fena olmasa da, istekleri bu şekilde yapmak, daha büyük istekler ve daha karmaşık CURLOPT_ parametreleriyle biraz elden çıkabilir.

Neyse ki, harika PHP topluluğu, karmaşıklığın çoğunu soyutlayan kitaplıklar yarattı. Daha popüler ağ kitaplıklarından ikisi Guzzle ve İsteklerdir. İstekler PHP'nin eski sürümlerini desteklediğinden ve WordPress tarihsel olarak gerçekten eski PHP sürümlerini desteklediğinden (😩), İstekler kitaplığı WordPress çekirdeğinde kullanılır.

WordPress'te cURL

Dahili olarak, WordPress ağ istekleri için WP_Http sınıfını kullanır ve bu da İstekler kitaplığına dayanır. Bu, wp_remote_get() ve wp_remote_post() gibi tüm HTTP yardımcı program yöntemlerinin İstekleri kullandığı anlamına gelir. Yüksek düzeyde, WordPress güncellemeleri, eklenti indirmeleri, eklenti güncellemeleri ve WordPress çekirdeğindeki hemen hemen tüm yükleme/indirme işlevleri, cURL bağlamalarının ve seçeneklerinin İstekler soyutlamasını kullanır.

İstek kitaplığının HTTP isteklerini nasıl yaptığına hızlıca göz atalım. wp-includes/class-http.php , WordPress içinde HTTP isteklerini yönlendiren birçok dahili tesisatı kontrol edebilirsiniz. WordPress 4.6'dan itibaren, WP_Http::request(); yöntem, Requests::request() yöntemini kullanır.

WordPress 5.7'de, bu çağrıyı yukarıda belirtilen WP_Http sınıfının 394. satırında bulabilirsiniz.

 $requests_response = Requests::request( $url, $headers, $data, $type, $options );

Oldukça basit değil mi? Şimdi aşağıdaki HTTP POST isteğini yukarıdaki ham CURLOPTS yöntemiyle karşılaştırın:

 $data = array( 'key1' => 'value1', 'key2' => 'value2' ); $response = Requests::post( 'http://httpbin.org/post', array(), $data );

Çok daha basit. Ve bir WordPress eklentisi veya teması bağlamında çalışıyorsanız, daha fazla soyutlama için wp_remote_post() işlevini kullanabilirsiniz:

 $data = array( 'key1' => 'value1', 'key2' => 'value2' ); $response = wp_remote_post( 'http://httpbin.org/post', array( 'data' => $data ) );

Şimdi konuşuyoruz! wp_remote_post() , yöntem parametresi olarak POST ile WP_Http::request() 'i çağırır.

Şimdi, İstekler dahili olarak çalıştığı sürece, 359 satırı civarında wp-includes/class-requests.php bir göz atalım.

Requests::request() yönteminde, kodun önce bir $transport seçeneği aradığını görebilirsiniz. İsteklerin WordPress uygulamasında, bu sırayla cURL ve fsockopen olmak üzere yalnızca 2 varsayılan seçenek vardır. fsockopen, PHP akışlarını kullanır ve cURL uzantısının yüklenmediği durumlar için bir geri dönüş işlevi görür.

 ... if (!empty($options['transport'])) { $transport = $options['transport']; if (is_string($options['transport'])) { $transport = new $transport(); } } else { $need_ssl = (0 === stripos($url, 'https://')); $capabilities = array('ssl' => $need_ssl); $transport = self::get_transport($capabilities); } $response = $transport->request($url, $headers, $data, $options); ...

Taşıma belirlendikten sonra, istek seçilen $transport sınıfına iletilir. Bu makalede cURL'yi ele aldığımızdan, İsteklerin cURL'yi nasıl kullandığını hızlıca inceleyeceğiz.

130. satır civarında wp-includes/Requests/Transport/cURL.php İsteklerin gerçekten nasıl çalıştığını göreceğiz. Bu sınıf, PHP'de cURL ile çalışmanın ne kadar karmaşık olabileceğini vurgular. Sınıf mantığının çoğu, istek ve yanıt başlıklarını doğrulamak ve işlemekle ve yönteme iletilen parametrelere dayalı olarak doğru CURLOPTS ayarlamakla ilgilidir.

309. Requests_Transport_cURL::setup_handler() yönteminde de birçok parametre ayarı işlenir; bu, geçirilen seçenekleri değiştirir ve doğru CURLOPT_ değerini doğru şekilde ayarlar:

 ... switch ($options['type']) { case Requests::POST: curl_setopt($this->handle, CURLOPT_POST, true); curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); break; case Requests::HEAD: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); curl_setopt($this->handle, CURLOPT_NOBODY, true); break; case Requests::TRACE: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); break; case Requests::PATCH: case Requests::PUT: case Requests::DELETE: case Requests::OPTIONS: default: curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); if (!empty($data)) { curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); } } ...

Sonuç olarak, tüm seçenekler ayarlandıktan sonra tüm bunlar bir curl_exec() çağrısına dönüşür. Karmaşık görünüyorsa, çünkü öyle! Farklı sunucular ve ana bilgisayarlar, HTTP üstbilgileri ve SSL işleme için farklı gereksinimlere sahiptir. İstekler, çok çeşitli kurulumları barındırmaya çalışmak için iyi bir iş çıkarır.

Ek olarak, WordPress'in ağ işlevleri içinde, gerektiğinde cURL seçeneklerinin geçersiz kılınmasına izin veren bazı kancalar vardır. Örneğin, yerel geliştirme ortamımdaki bir mu-plugin'de aşağıdakileri yorumladım:

 add_action('http_api_curl', function( $handle ){ //Don't verify SSL certs curl_setopt($handle, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($handle, CURLOPT_SSL_VERIFYHOST, false); //Use Charles HTTP Proxy curl_setopt($handle, CURLOPT_PROXY, "127.0.0.1"); curl_setopt($handle, CURLOPT_PROXYPORT, 8888); }, 10);

Yukarıdaki örnekte, önce SSL sertifikası doğrulamasını devre dışı bırakmak için http_api_curl kancasını kullanıyorum. Bu, doğrulanması gerekmeyen kendinden imzalı bir sertifikaya sahip bir geliştirme sitesiyle çalışırken yararlıdır. Bir yandan not olarak, ana bilgisayar doğrulamasını devre dışı bırakmak için cURL seçeneklerini geçersiz kılmanın harika bir alternatifi, yerel sunucunuz için kendi Sertifika Yetkilinizi oluşturmaktır.

İkinci blok, PHP'nin ağ isteklerini kablo üzerinden geçerken incelemek için Charles aracılığıyla proxy yapmama izin veriyor. Charles, yerel ortamınızdaki her isteğin en önemli ayrıntılarını görmenizi sağlayan ağ isteklerinin hatalarını ayıklamak için harika bir araçtır.

WordPress'te cURL'yi nasıl güncellerim?

Eh, yapmıyorsun. WordPress'in kendi cURL kitaplığı yoktur, ancak PHP kurulumunun sağladığı cURL sürümüne güvenir. PHP cURL uzantısı, libcurl çevresinde bir sarmalayıcıdır ve sunucuda yüklü olan libcurl sürümünü kullanır.

Bu nedenle, WordPress için cURL'yi yükseltmek, neredeyse her zaman web sunucusunda cURL'yi yükseltmekle aynı olacaktır. Kendiniz yönetmiyorsanız, bu, sunucu yöneticisinden veya barındırma şirketinden size yardımcı olmasını istemeniz gereken bir şeydir.

Kendi Ubuntu sunucunuzu yönetiyorsanız, en son libcurl sürümünü aşağıdakilerle edinebilirsiniz:

 sudo apt update sudo apt upgrade

Bu hala sizi eski bir cURL sürümüyle bırakıyorsa, muhtemelen Ubuntu'nun kendisini güncellemeniz gerekir. Bu, bu gönderi için biraz kapsam dışı, ancak cURL'nin güncelliğini yitirmiş olabileceğine dair işaretleri tanımakta fayda var.

Sunucunuzdaki cURL sürümünün çok eski olduğunun en belirgin işareti, WordPress'in HTTPS aracılığıyla uzak sunuculara bağlanamamasıdır. Aranacak hata mesajı cURL Error 60 . Bu hata, cURL'nin uzak ana bilgisayarın SSL sertifikasını doğrulayamadığı anlamına gelir. Bunun nedeni , sisteminizdeki eski bir kök sertifika listesi olabilir.

WordPress yönetici panosu aracılığıyla mevcut cURL sürümünüzü kontrol etmek için Araçlar → Site Sağlığı → Bilgi'ye gidin:

WordPress Site Sağlığı aracında sunucunuzla ilgili ayrıntılar

cURL sürümünüzü cURL sürümleri listesiyle karşılaştırın. 3 yıldan daha eskiyse, yükseltmek iyi bir fikirdir. 2017'den daha eskiyse, 23 Mart 2021'den itibaren bazı Amazon hizmetlerine bağlanmada sorun yaşayabilirsiniz.

Mac'te cURL

WP Migrate DB Pro için destek taleplerinde zaman zaman ortaya çıkan sorunlardan biri, cURL ve SSL'nin birlikte nasıl çalıştığıyla ilgilidir.

OpenSSL, şifreli iletişimleri işlemek için endüstri standardı bir SSL/TLS araç takımıdır. cURL gibi, başka bir yazılım kütüphanesidir. cURL, TLS protokolü üzerinden bağlantı kurmak için bir SSL/TLS araç takımı ile derlenir. WP Migrate DB Pro söz konusu olduğunda, bu, SSL sertifikası yüklü bir siteden (HTTPS siteleri) push veya çekme yapmaya çalıştığınızda olur. cURL , OpenSSL ile derlenmediğinde macOS'ta bir sorun ortaya çıkabilir.

cURL ile SSL kullanımı çok büyük bir konudur (konuyla ilgili destek belgeleri yazdık), ancak macOS ortamlarında sorun normalde SecureTransport adlı farklı bir SSL/TLS kitaplığının kullanılmasıdır.

Bu, Apple'ın SecureTransport'u gerekli tüm SSL/TLS özelliklerini OpenSSL kadar hızlı uygulamadığından Mac bilgisayarlarda sorunlara neden oluyordu. Örneğin, Apple'ın HTTP/2 protokolü desteğini dahil etmesi 2018'de OSX/High Sierra'ya (10.13.4) kadar sürdü. Bu, Mac'lerde yerel geliştirme için sorunlara neden olabilir. Durum şimdi çok daha iyi, ancak yine de Local Transport ile SSL'nin sizi ısırabileceği bazı nadir durumlar var.

PHP'nin hangi OpenSSL sürümünü kullandığını görmek için iyi bir test, 'SSL Sürümü' dizesi için phpinfo çıktısını aramak için grep kullanmaktır.

 php -i | grep "SSL Version"

Çıktıda OpenSSL veya SecureTransport kullanıp kullanmadığınızı görmelisiniz.

 # Ubuntu 20.04: SSL Version => OpenSSL/1.1.1i # MacOS 11.2.1 / Big Sur SSL Version => (SecureTransport) OpenSSL/1.1.1i

Gördüğünüz gibi, bir Ubuntu geliştirme sunucusundaki PHP OpenSSL'yi kullanır (ki biz bunu tercih ederiz), ancak Mac'imdeki PHP yorumlayıcısı Apple'ın SecureTransport'unu kullanır ve OpenSSL'ye bağlanır (yani bu gayet iyi olur).

Fakat bekle! cURL ve MacOS ile ilgili bir şey daha var. cURL CLI aracının Mac'imde ne rapor ettiğine yakından bakın:

 curl 7.64.1 (x86_64-apple-darwin20.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.41.0 Release-Date: 2019-03-27 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz MultiSSL NTLM NTLM_WB SPNEGO SSL UnixSockets

cURL CLI aracı ayrıca Apple'ın SecureTransport kitaplığını kullanır, ancak bu sefer SSL işleme için başka bir kitaplık olan LibreSSL'ye bağlantılarla birlikte. Burada dikkat edilmesi gereken ilginç nokta, bir Mac'te PHP'deki cURL ve komut satırındaki cURL'nin SSL işleme için farklı kitaplıklar kullanabilmesidir. 🙃

Komut satırı cURL'nizin PHP'deki cURL ile aynı şekilde davrandığından kesinlikle emin olmak istiyorsanız, OpenSSL sürümünü almak için bu komutu çalıştırabilirsiniz:

 brew install curl-openssl

Her iki sunucu da farklı OpenSSL sürümlerini kullanıyorsa sorunlar olabilir ve genellikle eşleşen sürümlere sahip olmak en iyisidir. Bu, SecureTransport kullanırken göreceğiniz hatalara yol açabilir.

Kapanış Düşünceleri

Artık cURL kitaplığının ne olduğunu ve nasıl kullanılacağını biliyoruz. PHP ve WordPress çekirdeğinin libcurl bağlamalarını nasıl kullandığının temellerini öğrenerek seviye atladık ve yaygın bir macOS cURL sorununun ayrıntılarını ele aldık.

Ağ oluşturma ve cURL hakkında düşünceleriniz nelerdir? İş akışınızda kullandığınız ipuçlarınız veya püf noktalarınız var mı? Aşağıdaki yorumlar bölümünde bize bildirin!

Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.

Check Also

Divi's Theme Builder ile Özel Global Başlık Nasıl Oluşturulur

Artık Tema Oluşturucu burada olduğuna göre, web sitenizi A'dan Z'ye kurmanıza yardımcı olacak yeni eğitimlere dalmak için sabırsızlanıyoruz. Buna Divi'nin yerleşik seçeneğini kullanarak özel başlıklar oluşturma da dahildir. Bu eğitimde Divi's Theme Builder'ı kullanarak global bir başlık oluşturmaya odaklanacağız. Bu sayfaya veya gönderiye farklı bir başlık atamadıysanız, web sitenizin her yerinde genel bir başlık görünecektir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir