পিএইচপি-তে কার্লের সময়সীমা নির্ধারণ করা


230

আমি পিএইচপি এর মাধ্যমে একটি এক্সিস্ট ডাটাবেসে কার্ল অনুরোধ চালাচ্ছি। ডেটাসেটটি খুব বড় এবং ফলস্বরূপ, একটি এক্সএমএল প্রতিক্রিয়া ফিরে পেতে ডাটাবেস ধারাবাহিকভাবে দীর্ঘ সময় নেয় long এটির সমাধানের জন্য, আমরা একটি দীর্ঘ সময়ের সমাপ্তি বলে মনে করে একটি কার্ল অনুরোধ সেট আপ করি।

$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";

curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'admin:');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);

তবে, কার্ল অনুরোধটি অনুরোধটি সম্পূর্ণ হওয়ার আগে ধারাবাহিকভাবে শেষ হয় (<ব্রাউজারের মাধ্যমে যখন অনুরোধ করা হয় 1000)। কার্লটিতে টাইমআউটগুলি সেট করার উপযুক্ত উপায় কিনা তা কি কেউ জানেন?

উত্তর:


346

ডকুমেন্টেশন দেখুন: http://www.php.net/manual/en/function.curl-setopt.php

CURLOPT_CONNECTTIMEOUT- সংযোগ দেওয়ার চেষ্টা করার সময় সেকেন্ডের সংখ্যা। অনির্দিষ্টকালের জন্য অপেক্ষা করতে 0 ব্যবহার করুন।
CURLOPT_TIMEOUT- সিআরএল ফাংশনগুলি সম্পাদন করতে সেকেন্ডের সর্বাধিক সংখ্যা।

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); 
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds

এছাড়াও পিএইচপি স্ক্রিপ্টের স্বয়ংক্রিয়ভাবে সময় নির্বাহকে বাড়িয়ে দিতে ভুলবেন না:

set_time_limit(0);// to infinity for example

13
set_time_limit(0);স্ক্রিপ্টটি কনসোলে চলছে কিনা আপনার দরকার নেই ।
CONvid19

6
@ পেড্রোলোবিটো আপনি যা উল্লেখ করেছেন তা হ'ল ক্লাইমে পিএইচপি এর ডিফল্ট কনফিগারেশন, তবে এটি সম্ভবত এটি সংশোধন করা হতে পারে।
চেরুভিম

4
@ চেরউভিম এখানে অবশ্যই স্পষ্টতই সঠিক (কেবল চালান php -d max_execution_time=1 -r 'while(true){$r=1*1;}'বা এমন কিছু কাজ হিসাবে পর্যবেক্ষণ করার জন্য যা
ক্লিমে

@ পেড্রো লোবিটো আপনার প্রয়োজন নেই set_time_limit(0)যদি আপনি এটি লুপের অভ্যন্তরে ব্যবহার না করেন।
ভিক্টর জোরাস

58

হুম, এটি আমার কাছে দেখে মনে হচ্ছে CURLOPT_TIMEOUTযে কোনও সিআরএল ফাংশনটি কার্যকর করতে যে পরিমাণ সময় নির্ধারিত হবে তা নির্ধারণ করে। আমি মনে করি CURLOPT_CONNECTTIMEOUTপরিবর্তে আপনার দিকে নজর দেওয়া উচিত , যেহেতু এটি সিআরএলকে সংযোগটি শেষ হওয়ার জন্য অপেক্ষা করার জন্য সর্বাধিক পরিমাণ বলে tells


পিএইচপি-দস্তাবেজগুলি বলছে CURLOPT_TIMEOUTযে ফাংশনটি কতক্ষণ সময় নেয়, তবে অন্তর্নিহিত কার্ল লাইব্রেরি ডক্সটি অনুরোধটি কতটা সময় নেয় তা সম্পর্কে বলে মনে হয়, যা একটি আকর্ষণীয় পার্থক্য - কোনটি পড়তে হবে তা নিশ্চিত নয়!
ফিদেলোপার

আমি এখানে মনে করি সবচেয়ে ভাল ব্যাখ্যা হল: stackoverflow.com/questions/27776129/...
fideloper

33

এটির সাথে একটি প্রশ্ন রয়েছে যা কিছু লোকের জন্য প্রাসঙ্গিক হতে পারে ... পিএইচপি ডক্স মন্তব্য থেকে।

আপনি যদি এক সেকেন্ডেরও কম সময়ের মধ্যে সিআরএলকে মেয়াদ উত্তীর্ণ করতে চান তবে আপনি ব্যবহার করতে পারেন CURLOPT_TIMEOUT_MS, যদিও "ইউনিক্সের মতো সিস্টেমগুলি" তে একটি বাগ / "বৈশিষ্ট্য" রয়েছে যা libcurl অবিলম্বে সময়সীমার কারণ হয়ে থাকে যদি "1000 URL ত্রুটির সাথে মান হয় 1000 ত্রুটি (২৮): সময়সীমা শেষ হয়েছে "। এই আচরণের ব্যাখ্যাটি হ'ল:

"যদি libcurl স্ট্যান্ডার্ড সিস্টেমের নাম সমাধানের সমাধানের জন্য নির্মিত হয়, তবে স্থানান্তরটির সেই অংশটি এখনও সেকেন্ডের ন্যূনতম সময়সীমা সহ সময়সামতের জন্য পূর্ণ-দ্বিতীয় রেজোলিউশন ব্যবহার করবে" "

পিএইচপি বিকাশকারীদের এর অর্থ "হ'ল আপনি প্রথমে এটি পরীক্ষা না করেই এই ফাংশনটি ব্যবহার করতে পারবেন না, কারণ আপনি বলতে পারবেন না যে libcurl স্ট্যান্ডার্ড সিস্টেমের নাম রেজলভার ব্যবহার করছে কিনা (তবে আপনি এটির ব্যাপারে নিশ্চিত হতে পারেন)"

সমস্যাটি হ'ল (লি | ইউ) নিক্সে, যখন লাইবকরল স্ট্যান্ডার্ড নেম রিসলভার ব্যবহার করে, নাম রেজোলিউশনের সময় একটি সিগালআরএম উত্থাপিত হয় যা লাইবকার্ল মনে করে যে সময়সীমা অ্যালার্ম।

সমাধানটি হ'ল CURLOPT_NOSIGNAL ব্যবহার করে সিগন্যাল অক্ষম করা। এখানে একটি উদাহরণ স্ক্রিপ্ট যা নিজেকে 10-সেকেন্ড বিলম্বের কারণ হিসাবে অনুরোধ করে যাতে আপনি সময়সীমা পরীক্ষা করতে পারেন:

if (!isset($_GET['foo'])) {
    // Client
    $ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
    $data = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);
    curl_close($ch);

    if ($curl_errno > 0) {
        echo "cURL Error ($curl_errno): $curl_error\n";
    } else {
        echo "Data received: $data\n";
    }
} else {
    // Server
    sleep(10);
    echo "Done.";
}

Http://www.php.net/manual/en/function.curl-setopt.php থেকে# 104597


হ্যালো, এই কোডটি কাজ করে তবে উত্স ফাইলটি 7MB এবং এটি আমাকে ডাউনলোড করে কেবল 52KB, কী ভুল হতে পারে? ইউআরএল হ'ল ওয়েবসারভার.ট
લ્ડ

@Simon ইস্ট আপনাকে সাহায্য করবে আমাকে দয়া করে করতে পারেন stackoverflow.com/questions/30861112/...
নাথন Srivi

এটি লক্ষ করা উচিত যে আপনি এই স্ক্রিপ্টটির সাথে টাইমআউট ত্রুটিটি আশা করছেন
kmoney12


12

আপনার এবং ফাইলের মধ্যে টাইমআউট সম্পর্কে নিশ্চিত হওয়া দরকার। এই ক্ষেত্রে পিএইচপি এবং কার্ল।

কোনও স্থানান্তর এখনও সক্রিয় থাকা অবস্থায় কার্লকে কখনই সময়সীমা শেষ না করার CURLOPT_TIMEOUTজন্য 0, তার পরিবর্তে আপনাকে সেট করতে হবে 1000

curl_setopt($ch, CURLOPT_TIMEOUT, 0);

পিএইচপি-তে, আপনাকে অবশ্যই সময়সীমা সরিয়ে ফেলতে হবে বা পিএইচপি এটি নিজেই (ডিফল্টরূপে 30 সেকেন্ড পরে) স্ক্রিপ্টটিকে কার্লের অনুরোধে মেরে ফেলবে। এটি একা আপনার সমস্যার সমাধান করা উচিত
তদতিরিক্ত, আপনার যদি ডেটা অখণ্ডতার প্রয়োজন হয় তবে আপনি সুরক্ষাের একটি স্তরটি ব্যবহার করে এটি ব্যবহার করতে পারেন ignore_user_abort:

# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);

# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);

ক্লায়েন্টের সংযোগ বিচ্ছিন্নকরণ স্ক্রিপ্টটির সম্পাদন এবং সম্ভবত ক্ষতিকারক ডেটা বাধাগ্রস্থ করবে
eg অ-ট্রানজিশনাল ডাটাবেস ক্যোয়ারী, একটি কনফিগার ফাইল তৈরি করা, ইসি। আপনার ক্ষেত্রে এটি একটি আংশিক ফাইল ডাউনলোড করবে ... এবং আপনি এই বিষয়টির যত্ন নিতে পারেন বা নাও পারেন।

এই পুরানো প্রশ্নের উত্তর দেওয়া হচ্ছে কারণ ইঞ্জিন অনুসন্ধানে এই থ্রেড শীর্ষে রয়েছে CURL_TIMEOUT


8

আপনি কোনও ব্রাউজার থেকে অনুরোধটি চালাতে পারবেন না, এটি প্রতিক্রিয়া জানাতে সিআরএল অনুরোধটি চালিত সার্ভারের জন্য অপেক্ষা করবে time ব্রাউজারটি সম্ভবত 1-2 মিনিটের মধ্যে ডিফল্ট নেটওয়ার্কের সময়সীমা শেষ হয়ে যায়।

আপনার এটি কমান্ড লাইন / টার্মিনাল থেকে চালানো দরকার।


2
+1 - সময়সীমাটি সম্ভবত কার্লের বাইরে is পর্যায়ক্রমে কিছু আউটপুট নিশ্চিত করার মাধ্যমে আপনি আসলে ব্রাউজারের সময়সীমা ঘিরে কাজ করতে পারেন; ব্রাউজারগুলি সাধারণত যখনই আরও ডেটা পান ততবার তাদের সময়সীমা পুনরায় সেট করে। তবে এটি হ্যাক; সিএলআইয়ের মাধ্যমে চলমান (প্রায়?) সর্বদা পছন্দনীয়।
ফ্র্যাঙ্ক ফার্মার

3

আপনি যদি পিএইচপিকে একটি ফাস্টসিজিআই অ্যাপ্লিকেশন হিসাবে ব্যবহার করছেন তবে নিশ্চিত হয়ে নিন যে আপনি ফাস্টসিজিআই টাইমআউট সেটিংস পরীক্ষা করেছেন। দেখুন: পিএইচপি কার্ল 500 ত্রুটি রাখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.