PHP
PHP में cURL का उपयोग करना
खोज…
वाक्य - विन्यास
- संसाधन कर्ल_इनिट ([स्ट्रिंग $ url = NULL])
- बूल कर्ल_सेटॉप (संसाधन $ ch, int $ विकल्प, मिश्रित $ मूल्य)
- bool curl_setopt_array (संसाधन $ ch, सरणी $ विकल्प)
- मिश्रित कर्ल_सेक्स (संसाधन $ ch)
- शून्य कर्ल_क्लोज (संसाधन $ ch)
पैरामीटर
पैरामीटर | विवरण |
---|---|
curl_init | - एक CURL सत्र प्रारंभ करें |
यूआरएल | CURL अनुरोध में उपयोग किया जाने वाला url |
curl_setopt | - CURL स्थानांतरण के लिए एक विकल्प सेट करें |
ch | CURL हैंडल ( कर्ल_इनिट () से वापसी मान) |
विकल्प | CURLOPT_XXX सेट किया जाना है - विकल्पों और स्वीकार्य मूल्यों की सूची के लिए PHP प्रलेखन देखें |
मूल्य | दिए गए विकल्प के लिए cURL हैंडल पर सेट किया जाने वाला मान |
curl_exec | - CURL सत्र करें |
ch | CURL हैंडल ( कर्ल_इनिट () से वापसी मान) |
curl_close | - CURL सत्र बंद करें |
ch | CURL हैंडल ( कर्ल_इनिट () से वापसी मान) |
मूल उपयोग (अनुरोध प्राप्त करें)
cURL URL सिंटैक्स के साथ डेटा ट्रांसफर करने का एक टूल है। यह HTTP, FTP, SCP और कई अन्य (कर्ल> = 7.19.4) का समर्थन करता है। याद रखें, आपको इसे उपयोग करने के लिए CURL एक्सटेंशन को इंस्टॉल और सक्षम करने की आवश्यकता है।
// a little script check is the cURL extension loaded or not
if(!extension_loaded("curl")) {
die("cURL extension not loaded! Quit Now.");
}
// Actual script start
// create a new cURL resource
// $curl is the handle of the resource
$curl = curl_init();
// set the URL and other options
curl_setopt($curl, CURLOPT_URL, "http://www.example.com");
// execute and pass the result to browser
curl_exec($curl);
// close the cURL resource
curl_close($curl);
पोस्ट अनुरोध
यदि आप HTML फॉर्म POST क्रिया की नकल करना चाहते हैं, तो आप cURL का उपयोग कर सकते हैं।
// POST data in array
$post = [
'a' => 'apple',
'b' => 'banana'
];
// Create a new cURL resource with URL to POST
$ch = curl_init('http://www.example.com');
// We set parameter CURLOPT_RETURNTRANSFER to read output
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Let's pass POST data
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
// We execute our request, and get output in a $response variable
$response = curl_exec($ch);
// Close the connection
curl_close($ch);
कई POST अनुरोध करने के लिए multi_curl का उपयोग करना
कभी-कभी हमें एक या कई अलग-अलग समापन बिंदुओं के लिए कई पोस्ट अनुरोध करने की आवश्यकता होती है। इस परिदृश्य से निपटने के लिए, हम multi_curl
उपयोग कर सकते हैं।
सबसे पहले, हम यह बनाते हैं कि सरल उदाहरण के समान तरीके से कितने अनुरोधों की आवश्यकता है और उन्हें एक सरणी में रखें।
हम curl_multi_init का उपयोग करते हैं और इसमें प्रत्येक हैंडल जोड़ते हैं।
इस उदाहरण में, हम 2 अलग-अलग समापन बिंदुओं का उपयोग कर रहे हैं:
//array of data to POST
$request_contents = array();
//array of URLs
$urls = array();
//array of cURL handles
$chs = array();
//first POST content
$request_contents[] = [
'a' => 'apple',
'b' => 'banana'
];
//second POST content
$request_contents[] = [
'a' => 'fish',
'b' => 'shrimp'
];
//set the urls
$urls[] = 'http://www.example.com';
$urls[] = 'http://www.example2.com';
//create the array of cURL handles and add to a multi_curl
$mh = curl_multi_init();
foreach ($urls as $key => $url) {
$chs[$key] = curl_init($url);
curl_setopt($chs[$key], CURLOPT_RETURNTRANSFER, true);
curl_setopt($chs[$key], CURLOPT_POST, true);
curl_setopt($chs[$key], CURLOPT_POSTFIELDS, $request_contents[$key]);
curl_multi_add_handle($mh, $chs[$key]);
}
फिर, हम अनुरोध भेजने के लिए curl_multi_exec का उपयोग करते हैं
//running the requests
$running = null;
do {
curl_multi_exec($mh, $running);
} while ($running);
//getting the responses
foreach(array_keys($chs) as $key){
$error = curl_error($chs[$key]);
$last_effective_URL = curl_getinfo($chs[$key], CURLINFO_EFFECTIVE_URL);
$time = curl_getinfo($chs[$key], CURLINFO_TOTAL_TIME);
$response = curl_multi_getcontent($chs[$key]); // get results
if (!empty($error)) {
echo "The request $key return a error: $error" . "\n";
}
else {
echo "The request to '$last_effective_URL' returned '$response' in $time seconds." . "\n";
}
curl_multi_remove_handle($mh, $chs[$key]);
}
// close current handler
curl_multi_close($mh);
इस उदाहरण के लिए एक संभावित वापसी हो सकती है:
' Http://www.example.com ' ने 2 सेकंड में 'फल' वापस करने का अनुरोध किया।
' Http://www.example2.com ' के अनुरोध ने 5 सेकंड में 'समुद्री भोजन' लौटा दिया।
एक कस्टम विधि के साथ अनुरोध बनाना और भेजना
डिफ़ॉल्ट रूप से, PHP कर्ल GET
और POST
अनुरोधों का समर्थन करता है। CURLOPT_CUSTOMREQUEST
पैरामीटर का उपयोग करके कस्टम अनुरोध, जैसे DELETE
, PUT
या PATCH
(या यहां तक कि गैर-मानक तरीके) भी भेजना संभव है।
$method = 'DELETE'; // Create a DELETE request
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
$content = curl_exec($ch);
curl_close($ch);
कुकीज़ का उपयोग करना
CURL बाद के अनुरोधों के साथ उपयोग के लिए प्रतिक्रिया में प्राप्त कुकीज़ रख सकता है। स्मृति में सरल सत्र कुकी हैंडलिंग के लिए, यह कोड की एक पंक्ति के साथ हासिल किया जाता है:
curl_setopt($ch, CURLOPT_COOKIEFILE, "");
ऐसे मामलों में जहां आपको CURL हैंडल के नष्ट होने के बाद कुकीज़ रखने की आवश्यकता होती है, आप उन्हें स्टोर करने के लिए फ़ाइल निर्दिष्ट कर सकते हैं:
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
फिर, जब आप उन्हें फिर से उपयोग करना चाहते हैं, तो उन्हें कुकी फ़ाइल के रूप में पास करें:
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
हालाँकि, याद रखें कि ये दो चरण तब तक आवश्यक नहीं हैं जब तक कि आपको अलग-अलग cURL हैंडल के बीच कुकीज़ ले जाने की आवश्यकता न हो। अधिकांश उपयोग के मामलों के लिए, CURLOPT_COOKIEFILE
को खाली स्ट्रिंग पर सेट करने की आवश्यकता है।
कुकी हैंडलिंग का उपयोग किया जा सकता है, उदाहरण के लिए, एक वेब साइट से संसाधनों को पुनः प्राप्त करने के लिए जिसे लॉगिन की आवश्यकता होती है। यह आमतौर पर एक दो-चरणीय प्रक्रिया है। सबसे पहले, लॉगिन पेज पर पोस्ट करें।
<?php
# create a cURL handle
$ch = curl_init();
# set the URL (this could also be passed to curl_init() if desired)
curl_setopt($ch, CURLOPT_URL, "https://www.example.com/login.php");
# set the HTTP method to POST
curl_setopt($ch, CURLOPT_POST, true);
# setting this option to an empty string enables cookie handling
# but does not load cookies from a file
curl_setopt($ch, CURLOPT_COOKIEFILE, "");
# set the values to be sent
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
"username"=>"joe_bloggs",
"password"=>"$up3r_$3cr3t",
));
# return the response body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
# send the request
$result = curl_exec($ch);
दूसरा चरण (मानक त्रुटि जाँच के बाद) आमतौर पर एक सरल GET अनुरोध है। दूसरे अनुरोध के लिए मौजूदा cURL हैंडल का पुन: उपयोग करना महत्वपूर्ण है। यह सुनिश्चित करता है कि पहली प्रतिक्रिया से कुकीज़ दूसरे अनुरोध में स्वचालित रूप से शामिल हो जाएंगी।
# we are not calling curl_init()
# simply change the URL
curl_setopt($ch, CURLOPT_URL, "https://www.example.com/show_me_the_foo.php");
# change the method back to GET
curl_setopt($ch, CURLOPT_HTTPGET, true);
# send the request
$result = curl_exec($ch);
# finished with cURL
curl_close($ch);
# do stuff with $result...
यह केवल कुकी से निपटने के उदाहरण के रूप में अभिप्रेत है। वास्तविक जीवन में, चीजें आमतौर पर अधिक जटिल होती हैं। अक्सर आपको लॉगिन टोकन प्राप्त करने के लिए लॉगिन पृष्ठ का प्रारंभिक GET प्रदर्शन करना होगा जिसे आपके POST में शामिल करने की आवश्यकता है। अन्य साइटें अपने उपयोगकर्ता-एजेंट स्ट्रिंग के आधार पर CURL क्लाइंट को ब्लॉक कर सकती हैं, जिससे आपको इसे बदलने की आवश्यकता होती है।
एक अनुरोध में कर्लफाइल के साथ बहुआयामी डेटा और कई फाइलें भेजना
मान लीजिए कि हमारे पास नीचे की तरह एक फॉर्म है। हम अपने वेबसर्वर को AJAX के माध्यम से और वहां से एक बाहरी सर्वर पर चलने वाली स्क्रिप्ट पर डेटा भेजना चाहते हैं।
इसलिए हमारे पास सामान्य इनपुट्स, एक बहु-चयन फ़ील्ड और एक फ़ाइल ड्रॉपज़ोन है जहां हम कई फाइलें अपलोड कर सकते हैं।
AJAX POST अनुरोध को सफल मानते हुए हमें PHP साइट पर निम्न डेटा प्राप्त हुआ:
// print_r($_POST)
Array
(
[first_name] => John
[last_name] => Doe
[activities] => Array
(
[0] => soccer
[1] => hiking
)
)
और फ़ाइलों को इस तरह दिखना चाहिए
// print_r($_FILES)
Array
(
[upload] => Array
(
[name] => Array
(
[0] => my_photo.jpg
[1] => my_life.pdf
)
[type] => Array
(
[0] => image/jpg
[1] => application/pdf
)
[tmp_name] => Array
(
[0] => /tmp/phpW5spji
[1] => /tmp/phpWgnUeY
)
[error] => Array
(
[0] => 0
[1] => 0
)
[size] => Array
(
[0] => 647548
[1] => 643223
)
)
)
अब तक सब ठीक है। अब हम कर्लफ़ाइल क्लास के साथ इस डेटा और फ़ाइलों को बाह्य सर्वर पर भेजना चाहते हैं
चूँकि CURL केवल एक सरल लेकिन एक बहुआयामी सरणी को स्वीकार नहीं करता है, हमें पहले $ _POST सरणी को समतल करना होगा।
ऐसा करने के लिए, आप इस फ़ंक्शन का उपयोग कर सकते हैं उदाहरण के लिए जो आपको निम्नलिखित देता है:
// print_r($new_post_array)
Array
(
[first_name] => John
[last_name] => Doe
[activities[0]] => soccer
[activities[1]] => hiking
)
अगला चरण अपलोड की गई फ़ाइलों के लिए कर्लफाइल ऑब्जेक्ट बनाना है। यह निम्नलिखित लूप द्वारा किया जाता है:
$files = array();
foreach ($_FILES["upload"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$files["upload[$key]"] = curl_file_create(
$_FILES['upload']['tmp_name'][$key],
$_FILES['upload']['type'][$key],
$_FILES['upload']['name'][$key]
);
}
}
curl_file_create कर्लफाइल क्लास का सहायक कार्य है और कर्लफाइल ऑब्जेक्ट बनाता है। हम अपनी फ़ाइलों के लिए "अपलोड [0]" और "अपलोड [1]" नाम की कुंजी के साथ $ फ़ाइल सरणी में प्रत्येक ऑब्जेक्ट को सहेजते हैं।
अब हमें चपटा पोस्ट एरे और फाइल्स ऐरे को मिलाना है और इसे $ डाटा की तरह सेव करना है:
$data = $new_post_array + $files;
अंतिम चरण CURL अनुरोध भेजने के लिए है:
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_POST => 1,
CURLOPT_URL => "https://api.externalserver.com/upload.php",
CURLOPT_RETURNTRANSFER => 1,
CURLINFO_HEADER_OUT => 1,
CURLOPT_POSTFIELDS => $data
));
$result = curl_exec($ch);
curl_close ($ch);
चूँकि $ डेटा अब एक साधारण (सपाट) सरणी है, इसलिए CURL स्वचालित रूप से सामग्री प्रकार: मल्टीपार्ट / फॉर्म डेटा के साथ यह POST अनुरोध भेजता है
Upload.php में बाहरी सर्वर पर अब आप $ _POST और $ _FILES के साथ पोस्ट डेटा और फाइलें प्राप्त कर सकते हैं जैसा कि आप सामान्य रूप से करते हैं।
Php में कस्टम http हेडर प्राप्त करें और सेट करें
अनुरोध हैडर भेजना
$uri = 'http://localhost/http.php';
$ch = curl_init($uri);
curl_setopt_array($ch, array(
CURLOPT_HTTPHEADER => array('X-User: admin', 'X-Authorization: 123456'),
CURLOPT_RETURNTRANSFER =>true,
CURLOPT_VERBOSE => 1
));
$out = curl_exec($ch);
curl_close($ch);
// echo response output
echo $out;
कस्टम हेडर पढ़ना
print_r(apache_request_headers());
आउटपुट: -
Array
(
[Host] => localhost
[Accept] => */*
[X-User] => admin
[X-Authorization] => 123456
[Content-Length] => 9
[Content-Type] => application/x-www-form-urlencoded
)
हम नीचे सिंटैक्स का उपयोग करके हेडर भी भेज सकते हैं: -
curl --header "X-MyHeader: 123" www.google.com