পিএইচপি এক্সিকিউট () বনাম সিস্টেম () বনাম পাস্ত্রু ()


312

পার্থক্য কি?

প্রতিটি কার্যকারিতা জন্য একটি নির্দিষ্ট পরিস্থিতি বা কারণ আছে? যদি হ্যাঁ, আপনি কি এই পরিস্থিতিতে কিছু উদাহরণ দিতে পারেন?

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

যদি আমি কেবল কোনও স্ক্রিপ্ট (বাশ বা অজগর) চালাতে পারি তবে আপনি কোন ফাংশনটি আমাকে ব্যবহার করার পরামর্শ দিচ্ছেন?


16
এছাড়াও আছে proc_open()এবং popen(), উভয়ই প্রসারিত প্রক্রিয়াটির উপর একটি উচ্চতর ডিগ্রি নিয়ন্ত্রণের অনুমতি দেয়।
খ্রিস্টান

উত্তর:


195

তাদের কিছুটা আলাদা উদ্দেশ্য রয়েছে।

  • exec() সিস্টেম কমান্ড কল করার জন্য, এবং সম্ভবত আউটপুটটি নিজেই ডিল করার জন্য।
  • system() একটি সিস্টেম কমান্ড কার্যকর করার জন্য এবং অবিলম্বে আউটপুট প্রদর্শন করার জন্য - সম্ভবত টেক্সট।
  • passthru() সিস্টেম কমান্ড কার্যকর করার জন্য যা আপনি কাঁচা প্রত্যাবর্তন চান - সম্ভবত কিছু বাইনারি।

নির্বিশেষে, আমি আপনাকে এগুলির কোনও ব্যবহার না করার পরামর্শ দিচ্ছি। এগুলি সকলেই অত্যন্ত অপ্রয়োজনীয় কোড উত্পাদন করে।


147
কখনও কখনও কার্যক্ষমতার জন্য বহনযোগ্যতা ত্যাগ করতে হয়। কিছু জিনিস আছে যা পিএইচপি কেবল ভাল করতে পারে না।
ফ্র্যাঙ্ক ক্রুক 5

30
@ ক্যালিয়াম: আপনি কি আপনার বিবৃতিতে আরও বিস্তারিত বলতে পারবেন? কিছু অস্পষ্ট শতাংশের পরিসংখ্যান বলাই আমাকে বোঝায় না। আমি বিশ্বাস করি যে স্ক্রিপ্টগুলি কার্যকর করতে সিস্টেম কলগুলি ব্যবহার করা পুরোপুরি ঠিক আছে যতক্ষণ না পুরো অ্যাপ্লিকেশনটি ব্যাক-এন্ডে একগুচ্ছ স্ক্রিপ্ট নির্ভর করে না।
কোডিংবিয়ার

46
@Christian izkata@izein:~$ dir -bash: dir: command not found- FreeBSD 'র
Izkata

5
@ ওজেড_ আমি এমন পরিস্থিতিতে এসেছি যেখানে আমাকে খুব ব্যয়বহুল গণনা করতে হয়েছিল। কোনও পিএইচপি-মডিউল তার জন্য উপলব্ধ ছিল না। আমি আমার নিজস্ব সি প্রোগ্রাম লিখেছি এবং আমি পাস্ত্র্রু () এর সাথে আবেদন করছি। কখনও কখনও বহনযোগ্যতা অন্যান্য জিনিস থেকে কম গুরুত্বপূর্ণ হতে পারে। প্রকল্পের উপর নির্ভর করে।
পাওলো

9
এছাড়াও, এটি একটি এর ভ্রান্ত ধারণা মনে করেন যে পিএইচপি হিসাবে আপনি এড়াতে যতদিন পোর্টেবল exec, system, passthru। পিএইচপি কোড এটি যে পরিবেশে চলে তার উপর নির্ভরশীল এবং অনেকগুলি সুরক্ষা বাগগুলি এটি বিবেচনায় না নেওয়ার কারণে রয়েছে। এখানে একটি দ্রুত উদাহরণ stackoverflow.com/questions/3003145/...
Pacerier

131

থেকে টানা হিসাবে http://php.net/ && Chipmunkninja :

সিস্টেম () ফাংশন

পিএইচপি-তে সিস্টেম ফাংশন কার্যকর করতে কমান্ডের সাথে একটি স্ট্রিং আর্গুমেন্ট গ্রহণ করে সেই আদেশের সাথে আপনি যে কোনও আর্গুমেন্ট পাস করতে চান। এই ফাংশনটি নির্দিষ্ট কমান্ডটি কার্যকর করে এবং ফলাফলের কোনও পাঠ্যকে আউটপুট প্রবাহে ফেলে দেয় (হয় ওয়েব সার্ভারের অবস্থার মধ্যে HTTP আউটপুট, অথবা আপনি যদি পিএইচপি কমান্ড লাইন সরঞ্জাম হিসাবে চালাচ্ছেন তবে কনসোল)। এই ফাংশনটির ফেরত হ'ল প্রোগ্রামটি থেকে আউটপুটের শেষ লাইন, যদি এটি পাঠ্য আউটপুটটি প্রকাশ করে।

Exec () ফাংশন

সিস্টেমের ফাংশনটি বেশ কার্যকর এবং শক্তিশালী, তবে এর সাথে সবচেয়ে বড় সমস্যাটি হ'ল প্রোগ্রামটি থেকে প্রাপ্ত সমস্ত ফলাফল সরাসরি আউটপুট প্রবাহে চলে যায়। এমন পরিস্থিতিতে থাকবে যেখানে আপনি ফলস্বরূপ পাঠ্যটি ফর্ম্যাট করতে এবং এটি অন্য কোনও উপায়ে প্রদর্শন করতে বা এটিকে একেবারে প্রদর্শন করতে পছন্দ করতে পারেন।

এই জন্য, পিএইচপি মধ্যে এক্সিকিউট ফাংশন নিখুঁতভাবে অভিযোজিত হয়। আউটপুট স্ট্রিমে চালিত হওয়া প্রোগ্রামের দ্বারা উত্পন্ন সমস্ত পাঠ স্বয়ংক্রিয়ভাবে ফেলে দেওয়ার পরিবর্তে এটি আপনাকে এই পাঠ্যটিকে দ্বিতীয় প্যারামিটারে ফাংশনে ফিরে আসা অ্যারেতে রাখার সুযোগ দেয়:

Shell_exec () ফাংশন

আমরা এখন পর্যন্ত যে প্রোগ্রামগুলি সম্পাদন করে চলেছি তার বেশিরভাগই কম বেশি, আসল প্রোগ্রাম 1 হয়েছে। যাইহোক, উইন্ডোজ এবং ইউনিক্স ব্যবহারকারীরা যে পরিবেশে কাজ করেন এটি আসলে এর চেয়ে অনেক বেশি সমৃদ্ধ। উইন্ডোজ ব্যবহারকারীদের উইন্ডোজ কমান্ড প্রম্পট প্রোগ্রামটি ব্যবহার করার বিকল্প রয়েছে, cmd.exe এই প্রোগ্রামটি একটি কমান্ড শেল হিসাবে পরিচিত।

Passthru () ফাংশন

একটি আকর্ষণীয় ফাংশন যা পিএইচপি আমরা এখনও অবধি দেখেছি তার অনুরূপ প্রদান করে is এই ফাংশন, অন্যদের মতো, আপনি যে প্রোগ্রামটি বলছেন তা সম্পাদন করে। যাইহোক, এটি তত্ক্ষণাত্ এই প্রোগ্রামটি থেকে কাঁচা আউটপুটটি আউটপুট প্রবাহে প্রেরণে প্রবাহিত হবে যা পিএইচপি বর্তমানে কাজ করছে (অর্থাত্ কোনও ওয়েব সার্ভারের দৃশ্যে এইচটিটিপি, অথবা পিএইচপি-র একটি কমান্ড লাইন সংস্করণে শেল)।

Proc_open () ফাংশন এবং popen () ফাংশন

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


6
শেল_এজেকের প্রয়োগের গতি অন্যান্য বিকল্পের চেয়ে দ্রুত।
দিনেশ সায়নী

29
আপনার উল্লেখ করা উচিত যে আপনি চিপমুনকিনজা থেকে সরাসরি আপনার উত্তরটি অনুলিপি করেছেন ।
টাচিয়োনওয়ারটেক্স

7
@ টাচিয়নভর্টেক্স ভাগ্যক্রমে তিনি উত্তরটি ভারব্যাটিমের অনুলিপি করেছেন, কারণ চিপমুনকিনজা আর নেই।
ফিলিও 99

2
ওয়েবব্যাক মেশিনে সেই নিবন্ধটির একটি অনুলিপি রয়েছে: web.archive.org/web/20130809032648/http://chipmunkninja.com/…
ব্যাগনি

2
পপেন এবং প্রোকোপেন সম্পর্কে কী?
সিএমসিডিগ্রাগনকাই

103

পূর্ববর্তী উত্তরগুলি কিছুটা বিভ্রান্তিকর বা অসম্পূর্ণ বলে মনে হচ্ছে, তাই এখানে পার্থক্যগুলির একটি সারণী এখানে ...

+----------------+-----------------+----------------+----------------+
|    Command     | Displays Output | Can Get Output | Gets Exit Code |
+----------------+-----------------+----------------+----------------+
| system()       | Yes (as text)   | Last line only | Yes            |
| passthru()     | Yes (raw)       | No             | Yes            |
| exec()         | No              | Yes (array)    | Yes            |
| shell_exec()   | No              | Yes (string)   | No             |
| backticks (``) | No              | Yes (string)   | No             |
+----------------+-----------------+----------------+----------------+
  • "ডিসপ্লে আউটপুট" এর অর্থ এটি আউটপুটটিকে ব্রাউজারে প্রবাহিত করে (বা কমান্ড লাইন থেকে চলমান থাকলে কমান্ড লাইন আউটপুট)।
  • "ক্যান আউটপুট" এর অর্থ আপনি কমান্ডের আউটপুট পেতে পারেন এবং এটি একটি পিএইচপি ভেরিয়েবলকে নির্ধারণ করতে পারেন।
  • "প্রস্থান কোড" হ'ল আদেশ দ্বারা ফিরে আসা একটি বিশেষ মান ("রিটার্নের স্থিতি" নামেও পরিচিত)। জিরোটির অর্থ সাধারণত এটি সফল ছিল, অন্যান্য মানগুলি সাধারণত ত্রুটি কোড।

অন্যান্য বিবিধ বিষয়গুলি সম্পর্কে সচেতন হতে হবে:

  • শেল_এক্সেক () এবং ব্যাকটিক্স অপারেটর একই কাজ করে।
  • এছাড়াও প্রকোপেন () এবং পপেন () রয়েছে যা আপনাকে এক্সিকিউটিভ কমান্ডের সাহায্যে ইন্টারেক্টিভভাবে স্ট্রিমগুলি পড়তে / লিখতে দেয়।
  • আপনি যদি ত্রুটি বার্তাগুলি ক্যাপচার / ডিসপ্লে করতে চান তবে কমান্ড স্ট্রিংয়ে "2> & 1" যুক্ত করুন।
  • কমান্ড আর্গুমেন্টগুলিতে সমস্যা অক্ষর থাকতে পারে তা থেকে বাঁচতে এস্কেপসেলসিএমডি () ব্যবহার করুন।
  • যদি আউটপুট সংরক্ষণ করতে exec আউটপুট ভেরিয়েবলটি পাস করতে হয় তবে $ আউটপুট খালি না থাকলে এটি এতে নতুন আউটপুট যুক্ত করবে। সুতরাং আপনার প্রথমে আনসেট ($ আউটপুট) লাগতে পারে।

কোনটি পিএইচপি ফাইল চালাতে পারে?
জনী কেন

1
@ জোহনিউই প্রতি পিছু কেউই না - যদি আপনি স্পষ্টতই পিএইচপি ক্লিমে বা এ জাতীয় অনুরোধ না করেন। আমি মনে করি আপনি includeএবং বন্ধুরা চান
Hagen von Eitzen

21

এটি আসলে আপনি কী আউটপুট পরিচালনা করতে চান তাতে কমান্ডটি ফিরে আসতে পারে এবং আপনি যদি আপনার পিএইচপি স্ক্রিপ্টটি কলি প্রোগ্রামটি শেষ করতে চান বা না করতে চান তবে তা নিচে আসে।

  • exec একটি কমান্ড কার্যকর করে এবং কলারকে আউটপুট দেয় (বা এটি একটি বৈকল্পিক ভেরিয়েবলে ফেরত দেয়)।

  • passthruexec()এটি একটি কমান্ড কার্যকর করে এমন ফাংশনের অনুরূপ । এই ফাংশনটি ইউনিক্স কমান্ড থেকে আউটপুট বাইনারি ডেটার জায়গায় exec()বা তার জায়গায় ব্যবহার করা উচিত system()যা সরাসরি ব্রাউজারে ফিরে যেতে হবে to

  • system একটি বাহ্যিক প্রোগ্রাম কার্যকর করে এবং আউটপুট প্রদর্শন করে তবে কেবল শেষ লাইন।

আপনার যদি কোনও কমান্ড কার্যকর করতে হয় এবং কোনও হস্তক্ষেপ ছাড়াই কমান্ড থেকে সমস্ত তথ্য সরাসরি ফেরত দেওয়া হয় তবে passthru()ফাংশনটি ব্যবহার করুন ।


8

আপনি যদি কমান্ড-লাইন থেকে আপনার পিএইচপি স্ক্রিপ্টটি চালাচ্ছেন তবে passthru()এর একটি বড় সুবিধা রয়েছে। এটা আপনাকে যেমন স্ক্রিপ্ট / প্রোগ্রামসমূহ চালানোর দেওয়া হবে vim, dialogইত্যাদি, ঐ প্রোগ্রাম হ্যান্ডেল নিয়ন্ত্রণ লেট এবং আপনার স্ক্রিপ্টটি ফিরে শুধুমাত্র যখন তারা করা হয়।

আপনি যদি এই স্ক্রিপ্টগুলি / প্রোগ্রামগুলি ব্যবহার করেন system()বা exec()চালিত করেন তবে এটি কার্যকরভাবে কাজ করবে না।

Gotcha: কিছু কারণে, আপনি সম্পন্ন করতে না পারা lessসঙ্গে passthru()পিএইচপি।


1
তুমি কি বলছ আমি বুঝতে পারছি না। আপনি সিএলআই এবং (এফ) সিজিআই (পাশাপাশি মোড_এফপি) উভয় থেকেই প্রোগ্রামগুলি সম্পাদন করতে পারেন। সিস্টেম-চাপানো নিষেধাজ্ঞাগুলি যেমন সেলিনাক্স থাকতে পারে। তবে একটি ভাল সেট আপ সিস্টেমে সেগুলি নির্বাচনমূলকভাবে বন্ধ থাকবে। অবশ্যই একটি শেয়ার্ড হোস্ট আলাদা গল্প, তবে আপনি সম্মানিত ক্লায়েন্টদের কাছে ভাগ করে নেওয়া পরিবেশের প্রস্তাব করবেন না , না?
খ্রিস্টান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.