PHP cURL Kullanımı

PHP: XML İşlemleri başlıklı yazının ardından, PHP ile ilgili yazılara istemci URL kütüphanesi cURL1 ile devam edelim.

AA

cURL

cURL konusunda daha önce komut satırı aracılığıyla kullanmak üzere cURL başlığı altında değinmiştim. Tekrar hatırlatmak gerekirse, curl, desteklediği bir çok protokol üzerinden (FTP, HTTP, HTTPS, SFTP, IMAP, POP3, SMTP gibi) veri aktarımı sağlayan bir kütüphane ve yazılım projesidir.

 PHP ve cURL Kullanımı

PHP aracılığıyla cURL işlevlerini kullanabilmek için libcurl2 paketinin 7.10.5 veya üstü sürümlerine ihtiyaç duyulmaktadır. Eğer sistemimizde kurulu ve çalışır durumda ise curl kütüphanesini kullanarak GET, POST, PUT, DELETE gibi istekler (request) ve bu isteklerle ilişkili işlemleri gerçekleştirebilir, XML ve JSON gibi veriler edinerek bu veriler üzerinde işlemler yapabiliriz. Örnek olarak ele alacağım konu WooCommerce API3 olacak. PHP ile GET isteği yaparak WooCommerce ürünlerini listeleyip, PUT ile yeni bir ürün ekleyeceğiz. Tabi, bu işlemler için Okuma/Yazma (ReadWrite) iznine sahip kimlik bilgilerine ihtiyacımız olacak.

WooCommerce REST API Kimlik Oluşturma

WooCommerce API

WooCommerce API şu anda v3 sürümü ile kullanımda. Kimlik bilgilerini oluşturmak için WooCommerce > Settings > Advanced > REST API adımlarını takip ederek ilgili sayfaya ulaşmalı ve Add Key butonu ile kimliğimizi oluşturmalıyız. Bu API erişim bilgileri olmadan çok sınırlı işlemler gerçekleştirebiliriz. Erişim bilgilerini almamızın ardından http(s)://alanadi.com/wp-json/wc/v3/products/ ile ürünlerimizi kolayca listeleyebiliriz. WooCommerce API ile ilgili daha detaylı bir yazı yayınlayacağım. Ancak, daha öncesinde incelemeler yapmak isterseniz WOO REST API – Introduction4 adresini ziyaret edebilirsiniz.

Öncelikle, PHP cURL kütüphanesine biraz yakından bakalım. Ardından, GET ve PUT isteklerini gerçekleştirebileceğimiz bir fonksiyon ile WooCommerce API işlemlerine geçebiliriz.

En temel hali ile cURL işlemini curl_init() fonksiyonu ile başlatır, başlattığımız bu işlemi curl_close() ile sonlandırabiliriz. Bu iki fonksiyon arasındaki isteğimiz, isteğimiz üzerinden edindiğimiz ve gönderdiğimiz veriler çerçevesinde şekillenir.

$curl = curl_init('https://www.google.com');

Bu işlemin ardından bize bir dönüş sağlanır ve curl_exec() ile bu dönüşü yakalarız. Bu dönüş bir XML/HTML, JSON, TXT gibi pek çok farklı formatta olabilir.

$resp = curl_exec($curl);

Artık edindiğimiz bu içeriği kullanabiliriz. O halde bağlamtımızı kapatalım.

curl_close($curl);

En temelde cURL işlemimiz bu kadar. Bundan sonraki aşama bizim edindiğimiz veriler ile ne yapacağımıza göre değişkenlik gösterecektir. Ancak, yukarıdaki işlem oldukça temel bir GET isteği üzerine oluşan ve çoğu zaman bizim için yeterli olmayacak bir yaklaşım. Dolayısıyla ek bazı parametreler belirlememizde fayda var. Örneğin, WooCommerce API erişiminde yaptığımız istekle beraber kimlik bilgilerimizi de iletmeliyiz ve/veya ürün eklemek için PUT metotunu kullanmalıyız. Bu ihtiyaçlar çerçevesinde kodumuzu biraz daha geliştirelim.

$creds = array(
    'user' => '<user>',
    'pass' => '<password>'
);

$url = 'https://alanadi.com/wp-json/wc/v3/products/';

$curl = curl_init();

curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, $creds['user'].":".$creds['pass']);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$resp = curl_exec($curl);

curl_close($curl);

$json = json_decode($resp, 1);
var_dump($json);

Sayfayı görüntülediğinizde bir ürünlerimize ait JSON çıktısı karşınıza çıkacaktır. Artık $json ile edindiğimiz içeriği kullanabiliriz. Daha önce WordPress API üzerine de yazılar üretmiştim. Bu yazıları inceleyerek ürünler dışında içerikleri de listeleyebilir, yeni içerikler ekleyebilir ve var olan içerikleri kontrol edebilirsiniz.

O halde örneğimizin son adımına geçelim ve bir fonksiyon ile isteklerimizi iletelim.

function callAPI($method, $url, $creds = array(), $data = false){
    if (extension_loaded("curl")) {
        $curl = curl_init();

        switch ($method){
            case "PUT":
                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");

                if ($data)
                    curl_setopt ( $curl, CURLOPT_POSTFIELDS, $data );
                    curl_setopt ( $curl, CURLOPT_HTTPHEADER, array (
                        'Content-Type: application/json',
                        'Content-Length: ' . strlen ( $data )
                    ));
                break;
            case "GET":
                curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
                break;
            default:
                if ($data)
                    $url = sprintf("%s?%s", $url, http_build_query($data));
            }

            // Optional Authentication:
            curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
            curl_setopt($curl, CURLOPT_USERPWD, $creds['user'].":".$creds['pass']);

            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

            $result = curl_exec($curl);
            curl_close($curl);
        } else {
            echo "cURL paketi kurulu değil.";
        }
        return $result;
    }

    $creds = array(
        'user' => '<user>',
        'pass' => '<password>'
    );

    $result = callAPI('GET', 'https://alanadi.com/wp-json/wc/v3/products/', $creds);
    $json = json_decode($result, true);

    echo '
        <table>
            <thead><th>ID</th><th>İsim</th><th>SKU</th><th>Fiyat</th><th>Durum</th><th>Oluşturma</th><th>Güncelleme</th></thead>
            <tbody>';
    for($i = 0; $i < intval(count($json)); $i++){
        echo '
            <tr>
                <td>'.$json[$i]['id'].'</td>
                <td>'.$json[$i]['name'].'</td>
                <td>'.$json[$i]['sku'].'</td>
                <td>'.$json[$i]['price'].'</td>
                <td>'.$json[$i]['status'].'</td>
                <td>'.$json[$i]['date_created'].'</td>
                <td>'.$json[$i]['date_modified'].'</td>
            </tr>';
    }
    echo '</tbody></table>';

Yukarıdaki örneği elbette dizilerle daha derli toplu bir hale getirmek mümkün5 6 7.

Daha önce yayınladığım PHP ile XML İşlemleri başlıklı yazı ile ilişkili olarak XML üzerinden edindiğiniz bilgileri her işlem için ayrı SQL satırları yazmak yerine REST API aracılığıyla hızlı, etkili ve güvenli bir şekilde yönetebilirsiniz. Dilerseniz bir PHP dosyası veya bir WordPress eklentisi olarak ihtiyaçlarınız doğrultusunda yetenekler ekleyerek ilerleyebilirsiniz. Hatta, CronJob tanımlayarak belirlediğiniz zamanlarda belirttiğiniz işlemlerin otomatik bir şekilde gerçekleştirilmesini sağlayabilirsiniz. Bu Cloudinary gibi bir servise görsellerinizi gönderip, sıkıştırılmasını sağlamak olabileceği gibi farklı pazaryerlerinde bulunan ürünlerinizin stok ve fiyat takibini yönetmek de olabilir.

İleri Okumalar

  1. PHP cURL Examples: 10 Awesome Things to Do With cURL
  2. github: php-curl-class
  3. Php, Curl, Bulutfon API’yi kullanarak gelen faksların listelenmesi
  4. 5 PHP cURL examples
  5. Yusuf Sezer. “PHP cURL Nedir? Kurulumu ve Kullanımı”
  6. Yazılım Derdi. Php de CURL Post ve Get Kullanımı