পিএইচপি সিআরএল বনাম ফাইল_জেট_কন্টেন্টস


111

একটি REST এপিআই অ্যাক্সেস করার সময় এই দুটি টুকরো কোড কীভাবে আলাদা হয়?

$result = file_get_contents('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');

এবং

$ch = curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);

তারা উভয়ই একই ফলাফল উত্পাদন করে বিচার করে

print_r(json_decode($result))

2
cURLতুলনায় অনেক বেশি সক্ষম file_get_contents। এটি যথেষ্ট হওয়া উচিত।

18
FWIW গতির সাথে সামান্য পার্থক্য আছে। আমি সবেমাত্র 5,000 টি ইউআরএল আনা এবং ফাইলগুলিতে তাদের এইচটিএমএল সংরক্ষণ করা (ফাইল প্রতি 200k) সংরক্ষণ করেছি। আমি অর্ধেকটি কার্ল দিয়ে এবং অর্ধেক ফাইল_জেট_কন্টেন্টস হিসাবে একটি পরীক্ষা হিসাবে করেছি এবং এতে কোনও বোধগম্য পার্থক্য নেই।
ডেভিড গিলবার্টসন

8
যতক্ষণ আপনি স্ট্রিম প্রসঙ্গে সমর্থন করে এমন একটি সংস্করণ ব্যবহার করছেন ততক্ষণ ফাইল_জেট_কন্টেন্টস সহ পোস্ট ডেটা প্রেরণ করা সম্ভব।
ক্রিস স্ট্রিকল্যান্ড

উত্তর:


129

file_get_contents()একটি সাধারণ স্ক্রু ড্রাইভার। সাধারণ জিইটি অনুরোধগুলির জন্য দুর্দান্ত যেখানে হেডার, এইচটিটিপি অনুরোধ পদ্ধতি, সময়সীমা, কুকিজার, পুনর্নির্দেশগুলি এবং অন্যান্য গুরুত্বপূর্ণ বিষয়গুলি বিবেচনা করে না।

fopen()একটি সঙ্গে প্রবাহ প্রেক্ষাপটে বা কার্ল setopt প্রত্যেক বিট এবং বিকল্প আপনি মনে করতে পারেন সঙ্গে powerdrills হয়।


17
এই রূপকের মধ্যে থাকার জন্য, নোট করুন যে সিআরএল একটি জটিল ড্রিল চকের সাথে পাওয়ারড্রিল যা এটির পরিবর্তনের জন্য আপনাকে এটি খুব ভালভাবে জানতে হবে (পড়ুন: সিআরএল বিকল্পগুলি নির্ধারণ করা কিছুটা ক্লান্তিকর, তবে আপনার যা কিছু করার অনুমতি দেয়)।
অকর্মা

20
file_get_contentsপ্রসঙ্গ সেট করার অনুমতি দেয়, যার অর্থ আপনি নিজের পছন্দ মতো শিরোনাম ক্ষেত্রগুলি সেট করতে পারেন।
উলফ

4
এবং @ ওলফের মন্তব্য ছাড়াও, স্ট্রিমের প্রসঙ্গে একটি ফাইল_জেট_কন্টেন্টস অনুরোধের সাথে পোস্ট, পুট, প্রমাণীকরণ, শিরোনাম, সামগ্রী, প্রক্সি এবং আরও অনেক কিছু প্রেরণ করা সম্ভব
মার্কাস

@ লিফ: হ্যাঁ এবং পদ্ধতি, খুব। এবং পুনঃনির্দেশ। এবং সময়সীমা ... php.net/manual/en/context.htp.php
Sz।

25

এগুলি ছাড়াও, সাম্প্রতিক কিছু ওয়েবসাইট হ্যাকের কারণে আমাদের সাইটগুলিকে আরও সুরক্ষিত করতে হয়েছিল। এটি করার সময় আমরা আবিষ্কার করেছি যে ফাইল_গেট_কন্টেন্টগুলি কাজ করতে ব্যর্থ হয়েছে, যেখানে কার্ল এখনও কাজ করবে।

100% নয়, তবে আমি বিশ্বাস করি যে এই php.ini সেটিংসটি ফাইল_গেট_কন্টেন্টস অনুরোধটি ব্লক করে থাকতে পারে ।

; Disable allow_url_fopen for security reasons
allow_url_fopen = 0

যে কোনও উপায়ে, এখন আমাদের কোডটি কার্ল দিয়ে কাজ করে ।


9
হ্যাঁ, file_get_contentsপ্রয়োজন allow_url_fopentruthy যাবে।
কোস্টা

2
হ্যাঁ, বহু হোস্টিং সংস্থা file_get_contents()ফাংশনটি ব্যবহার করে বলে পরিচিত এমন অনেকগুলি শোষণের কারণে অক্ষম করছে। সিআরএল হ'ল কোডটি এখন লোকেরা কোডে ব্যবহার করা উচিত।
হতাশ

15
@ ফ্রাস্ট্রেটেটেক এইগুলি "শোষণ" কী?
rdlowrey

3
হোস্টিং সংস্থাগুলি অক্ষম করে allow_url_fopenকারণ তারা এটির জন্য এক ধরণের ভুল করে allow_url_includeallow_url_fopenএবং file_get_contentsব্যবহার করার জন্য জরিমানা।
ফ্রিজমগ

2
@ ভিআর_ড্রাইভার এই লিঙ্কগুলির কোনও যোগসূত্র নেইfile_get_contents()
rdlowrey

19

এটি পুরানো বিষয় তবে আমার এক এপিআইতে আমার শেষ পরীক্ষায় সিআরএল দ্রুত এবং আরও স্থিতিশীল। কখনও কখনও বৃহত্তর অনুরোধে ফাইল_জেট_কন্টেন্টগুলির 5 সেকেন্ডের বেশি সময় প্রয়োজন যখন সিআরএল কেবল 1.4 থেকে 1.9 সেকেন্ডের মধ্যে দ্বিগুণ দ্রুত যা প্রয়োজন।

আমার এটিতে একটি নোট যুক্ত করতে হবে যে আমি কেবল জিইটি পাঠিয়ে জেএসএন সামগ্রী পাঠাচ্ছি। আপনি যদি সঠিকভাবে সিআরএল সেটআপ করেন তবে আপনার দুর্দান্ত সাড়া হবে। আপনাকে কী প্রেরণ করতে হবে এবং আপনাকে কী পুনরুদ্ধার করতে হবে তা কেবল "বলুন" এবং এটাই।

আপনার প্রতিবেদনে আমি এই সেটআপটি করতে চাই:

$ch =  curl_init('http://api.bitly.com/v3/shorten?login=user&apiKey=key&longUrl=url');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
$result = curl_exec($ch);

এই অনুরোধটি 0.01 সেকেন্ডের সর্বোচ্চে ডেটা ফেরত দেবে


1
0.1 মাইক্রোসেকেন্ডস (এক মিলিয়ন সেকেন্ডের 1/1000) ... আমি বিশ্বাস করতে পারি যে এটি কঠিন।
মার্ক টমলিন

হ্যাঁ. 0.02ms এ আমার কিছু প্রতিক্রিয়া রয়েছে উদাহরণস্বরূপ টোভিলিও এপিআই ফোন নম্বর চেক। দ্রুত.
আইভিজান স্টিফান স্টিপিয়াস

4
0.02ms = 20 মাইক্রোসেকেন্ড; আপনি বলেছেন 0.1 টি মাইক্রোসেকেন্ড যা সঠিক হতে পারে না।
ওয়াল্ফ

2
এটি তুলনায় এটি প্রায় দ্বিগুণ দ্রুত file_get_contents মাত্র আমি নিশ্চিত করার জন্য কিছু এপিআই কল করেছি। (3 এপিআই কল) এর জন্য file_get_contents& 0.49 সেকেন্ডের জন্য 0.8 সেকেন্ডcurl
জেএসপি

1
আপনার নিজের সেটআপ ব্যবহার করা উচিত। তারপরে আপনার প্রশ্নগুলি 1.4-1.9 থেকে 0.01 সেকেন্ডে চলে যাবে;)
রাউলি রাজান্ডে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.