PDA

View Full Version : سوال: curl_exec بدون بازگشت



mlotfi63
شنبه 27 شهریور 1389, 23:09 عصر
با سلام:
قطعه کد زیر متغیر q رو با مقدار 1 به url$ پست میکنه، و نتیجه curl_exec در r$ ذخیره میشه، تا اینجا که مشکلی نیست و همه چیز درست انجام میشه.
اما چیزی که من نیاز دارم اینه که کد فقط متغیر q رو با مقدار 1 به url$ پست کنه و هیچ مقدار بازگشتی نداشته باشه، (نه اینکه نمایش نده، اصلاً نباید مقدار بازگشتی داشته باشیم)، دلیلش هم فرض بر بالا بودن حجم اطلاعات بازگشتی هستش که در نتیجه curl_exec دریافت میشه. لطفاً راهنمایی کنید، با تشکر...




<?php
$url = 'http://www.paiz.ir/';
$h = curl_init();
curl_setopt($h, CURLOPT_URL, $url);
curl_setopt($h, CURLOPT_POST, true);
curl_setopt($h, CURLOPT_POSTFIELDS, "q=1");
curl_setopt($h, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($h, CURLOPT_NOBODY, true);
$r = curl_exec($h);
curl_close($h);
?>


--------------------
در ضمن وقتی CURLOPT_RETURNTRANSFER = false باشه curl_exec خود به خود چاپ میشه، اگر نه curl_exec خروجی رو return میکنه...

امیـرحسین
شنبه 27 شهریور 1389, 23:43 عصر
تابع curl_exec خودبخود هیچکاری نمیکنه. با تعیین مقدار برای CURLOPT_RETURNTRANSFER مشخص می کنیم که محتوای برگشتی داشته باشیم یا خیر:

curl_exec (http://ir.php.net/manual/en/function.curl-exec.php) :: Return Values
Returns TRUE on success or FALSE on failure. However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, FALSE on failure.

mlotfi63
شنبه 27 شهریور 1389, 23:54 عصر
تابع curl_exec خودبخود هیچکاری نمیکنه. با تعیین مقدار برای CURLOPT_RETURNTRANSFER مشخص می کنیم که محتوای برگشتی داشته باشیم یا خیر:

curl_exec (http://ir.php.net/manual/en/function.curl-exec.php) :: Return Values
Returns TRUE on success or FALSE on failure. However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, FALSE on failure.


نه، اینطور نیست، اشتباه میکنید، دو قطعه کد زیر رو در نظر بگیرید، نتیجه هر دو یکیه:




<?php
$url = 'http://www.paiz.ir/';
$h = curl_init();
curl_setopt($h, CURLOPT_URL, $url);
curl_setopt($h, CURLOPT_RETURNTRANSFER, true);
$r = curl_exec($h);
print($r);
curl_close($h);
?>


<?php
$url = 'http://www.paiz.ir/';
$h = curl_init();
curl_setopt($h, CURLOPT_URL, $url);
//curl_setopt($h, CURLOPT_RETURNTRANSFER, true);
/* $r = */ curl_exec($h);
//print($r);
curl_close($h);
?>

و این هم یک مثال از php docs (http://ir.php.net/manual/en/function.curl-exec.php):




<?php
// create a new cURL resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
// grab URL and pass it to the browser
curl_exec($ch);
// close cURL resource, and free up system resources
curl_close($ch);
?>

امیـرحسین
یک شنبه 28 شهریور 1389, 00:47 صبح
حق با شماست.
اینطور به نظر میاد که درخواست تنها نداریم و هر درخواستی، نیاز به Header نتیجه داره و Header هم با محتوا همراهه یعنی درخواست که میدیم محتوا هم باهاش برمیگرده.
به هر طریق، کد زیر از طریق سوکت عملیات مشابه رو انجام میده که من بخش feofاش رو حذف کردم:
<?php
/*
** The function: http://www.jonasjohn.de/snippets/php/post-request.htm
*/

function PostRequest($url, $referer, $_data) {
$data = array();
while(list($n,$v) = each($_data)){ $data[] = "$n=$v"; }
$data = implode('&', $data);
$url = parse_url($url);
if ($url['scheme'] != 'http') { die('Only HTTP request are supported !'); }

$host = $url['host'];
$path = $url['path'];
$fp = fsockopen($host, 80);
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Referer: $referer\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ". strlen($data) ."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $data);
/*
$result = '';
while(!feof($fp)) {
// receive the results of the request
$result .= fgets($fp, 128);
}
*/
// close the socket connection:
fclose($fp);

// split the result header from the content
//$result = explode("\r\n\r\n", $result, 2);

//$header = isset($result[0]) ? $result[0] : '';
//$content = isset($result[1]) ? $result[1] : '';

// return as array:
//return array($header, $content);
}



/*
** The example:
*/

// submit these variables to the server:
$data = array(
'test' => 'foobar',
'okay' => 'yes',
'number' => 2
);

// send a request to example.com (referer = jonasjohn.de)
list($header, $content) = PostRequest(
"http://www.example.com/",
"http://www.jonasjohn.de/",
$data
);

// print the result of the whole request:
//print $content;

// print $header; --> prints the headers
?>منبع: How to do a POST request (http://www.jonasjohn.de/snippets/php/post-request.htm)

این رو هم امتحان کنید شاید سریعتر عمل کنه: HTTP library (http://usphp.com/manual/en/book.http.php)

امیـرحسین
یک شنبه 28 شهریور 1389, 00:57 صبح
یک Option وجود داره به نام CURLOPT_NOBODY که جلوی خروجی رو میگیره ولی وقتی از CURLOPT_POST استفاده می کنیم بی اثر میشه. اگر اون مقدار q رو می تونید بصورت GET بدید، این Option جواب میده...
$ch = curl_init("www.example.com?q=58");
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_HEADER, false);
//curl_setopt($ch, CURLOPT_POST, true);
//curl_setopt($ch, CURLOPT_POSTFIELDS, "q=1");
curl_exec($ch);
curl_close($ch);

Hell Lord
یک شنبه 28 شهریور 1389, 10:04 صبح
با استفاده از


$info = curl_getinfo($ch);
یک تست بزنید، برای خطا یابی مفید است.
اینجا هم مقادیرش را نوشته است : curl_getinfo() (http://nl.php.net/manual/en/function.curl-getinfo.php)
به نظر من هم استفاده از fsockopen خیلی مفید تر از curl است.

mlotfi63
دوشنبه 29 شهریور 1389, 00:45 صبح
بله مشکل دقیقاً همینه، اگر توجه کرده باشید من CURLOPT_NOBODY رو ضمیمه کردم ولی متاسفانه جلوی POST رو میگیره و از GET هم نمیتونم استفاده کنم.