সূচীপত্র
- অধ্যায়-১ : পিএইচপির শুরু ➲ পিএইচপি কি? ➲ পিএইচপির ইতিহাস ➲ পিএইচপির শুরু ➲ কিভাবে পিএইচপি কাজ করে ➲ পিএইচপি স্ক্রিপ্টের গঠন ➲ পিএইচপি কোড লেখা ➲ ওয়েব পেজে কনটেন্ট ডিসপ্লে করা ➲ ভ্যারিয়েবলের ব্যবহার ➲ কনস্ট্যান্ট এর ব্যবহার ➲ ডাটা টাইপ ➲ গাণিতিক অপারেটরের ব্যবহার ➲ নাম্বার ফরম্যাট করা ➲ এ্যারে
- অধ্যায়-২ : পিএইচপি স্ক্রিপ্ট তৈরি ➲ কন্ডিশন বা শর্ত সেট করা ➲ এক্সপ্রেশনে প্যাটার্নের মিলকরণ ➲ কন্ডিশনাল স্টেটমেন্টের ব্যবহার ➲ সুইচ স্টেটমেন্টের ব্যবহার ➲ লুপ ➲ while লুপ ➲ do…while লুপ ➲ ফাংশনের ব্যবহার ➲ ফাংশন তৈরি ➲ ফাংশনে ভ্যারিয়েবলের ব্যবহার
- অধ্যায়-৩ : পিএইচপি ও অপারেটিং সিস্টেম ➲ ফাইল ম্যানেজিং ➲ ফাইল সম্পর্কিত তথ্য সংগ্রহ ➲ ফাইল কপি, রিনেম ও ডিলিট করা ➲ ডিরেক্টরী তৈরি ➲ ডিরেক্টরীর সব ফাইলের তালিকা তৈরি ➲ অপারেটিং সিস্টেম কমান্ডের ব্যবহার ➲ ব্যাকটিকের ব্যবহার ➲ সিস্টেম ফাংশনের ব্যবহার ➲ ইএক্সইসি ফাংশনের ব্যবহার ➲ পাসথ্রো ফাংশনের ব্যবহার ➲ সিস্টেম কমান্ডের এরর মেসেজ ➲ নিরাপত্তা ➲ এফটিপি ➲ এফটিপি সার্ভারে লগইন ➲ ডিরেক্টরীর ফাইলের তালিকা তৈরি ➲ এফটিপির মাধ্যমে ফাইল ডাউনলোড ও আপলোড ➲ অন্যান্য আরো এফটিপি ফাংশন ➲ ফাইল পড়া ও লেখা ➲ ফাইল খোলা ➲ রিড মুডে ফাইল খোলা ➲ রাইট মুডে ফাইল খোলা ➲ অন্য ওয়েব সাইটের ফাইল খোলা ➲ ফাইল বন্ধ করা ➲ ফাইল পড়া ➲ এ্যারেতে ফাইল পড়া ➲ অন্য প্রোগ্রামের সাথে তথ্য বা ডাটা বিনিময় ➲ ফ্ল্যাট ফাইলে ডাটা বিনিময় ➲ কমা ডিলিমিটেড ফরম্যাটে ডাটা বিনিময়
ডাইনামিক ওয়েব এপ্লিকেশন ডেভেলপ করতে এইচটিএমএল, পিএইচপি ও সিএসএস টুলগুলো ব্যবহার করা হয়। এইচটিএমএল, সিএসএস দিয়ে মার্কআপ করে পেজকে প্রেজেন্টেশন করা হয় আর পিএইচপি ডাইনামিক পেজে ডাটা স্টোর ও রিট্রিভ করতে মাইএসকিউএলের সাথে কাজ করে। বেশিরভাগ ওয়েব এপ্লিকেশনেই পিএইচপি শুধুমাত্র মাইএসকিউএলের সাথে কাজ করে। কিন্তু কিছু কিছু ক্ষেত্রে এপ্লিকেশনে আরো কিছু জঠিল বিষয়ে কাজ করতে হয়। আর তা হলো অপারেটিং সিস্টেম বা সিস্টেমের অন্য কোন সফটওয়্যারের সাথে পিএইচপির কাজ।
পিএইচপিতে একটি ফটোগ্যালারি এপ্লিকেশন তৈরি করতে আপনাকে অপারেটিং সিস্টেমের সাথে কাজ করতে হবে। ফটোগ্যালারিতে ব্যবহারকারী গ্রাফিক ফাইল বা ছবি আপলোড করবে। এই ধরণের এপ্লিকেশনে আপলোড করা ফাইলগুলোকে মেনটেইন করতে হবে। যেমন- ফাইল রিনেম করা, মুভ করা, ডিলিট করা ইত্যাদি। তাছাড়া ছবিটি কখন আপলোড করা হয়েছে, সর্বশেষ কখন দেখা হয়েছে এরকম তথ্য দেখানো। এগুলোর জন্য পিএইচপিতে ফাইল সিস্টেম নিয়ে কাজ করার ফিচার রয়েছে।
পিএইচপি আপনার কম্পিউটারের বা সিস্টেমের যে কোন প্রোগ্রামও রান করাতে পারে। পিএইচপি কোড দিয়ে এফটিপির (FTP- File Transfer Protocol) মাধ্যমে এক কম্পিউটার থেকে অন্য কম্পিউটারে ফাইল স্থানান্তর করা হয়। পিএইচপির মাধ্যমে ডাটাবেজ ছাড়াও নির্দিষ্ট ফাইলে আপনার তথ্য সংরক্ষণ করতে পারেন।
এই অধ্যায়ে আমরা পিএইচপিতে সিস্টেম সম্পর্কিত কাজ, সিস্টেমের কাজের ক্ষেত্রে নিরাপত্তার বিষয়সহ অন্যান্য বিষয়গুলো নিয়ে আলোচনা করব।
ফাইল ম্যানেজিং
হার্ডডিস্কে আমরা প্রয়োজনীয় তথ্য নির্দিষ্ট ফাইলের ভিতরে সংরক্ষণ করে তা ফোল্ডারের মধ্যে সাজিয়ে রাখি। যেন সহজেই কাঙ্খিত ফাইল বা তথ্যটি খুঁজে পাই। এভাবে সাজিয়ে না রাখলে প্রয়োজনের সময় ফাইলটি পাওয়া খুবই কঠিন হয়ে যাবে। যেমন- একটি ড্রয়ারের মধ্যে অনেকগুলো ফাইল রাখলে নির্দিষ্ট একটি ফাইলকে সহজে খুজে পাওয়া যাবে না। তাই আলাদা আলাদা ড্রয়ারে নির্দিষ্ট ধরনের ফাইল রাখলে খুব সহজেই প্রয়োজনের সময় তা পাওয়া যাবে। একেই বলা হয় ডিরেক্টরী বা ফোল্ডার। আর ফোল্ডার তৈরি করে সংশ্লিষ্ট ফাইলকে এর ভিতর সংরক্ষণ করাকে বলা হয় ফাইল সিস্টেম।
একটি ফাইল সিস্টেমে উপরের দিকে সাজানো বা পড়া হয়। উপরের দিক তথা ডিরেক্টারীর প্রথম অংশটিকে বলা হয় রুট(root)। যেমন c:\। রুট ডিক্টেরীর ভিতর অন্য ডিরেক্টরী, তার ভিতর আরো ডিরেক্টরী এভাবেই ফোল্ডার বানিয়ে ডিরেক্টরী সাজানো হয় এবং ফাইল রাখা হয়। এই গঠনটি আরো অনেক বড়ও হতে পারে।
পিএইচপির মাধ্যমে নির্দিষ্ট কোন ডিরেক্টরীতে রাখা ফাইল- যাচাই করা (exist), কপি করা (copy), রিনেম করা (rename), ডিলিট করা (delete) ইত্যাদি অনেক কাজ করা যায়।
ফাইল সম্পর্কিত তথ্য সংগ্রহ
নির্দিষ্ট ফাইল নিয়ে কাজ করার জন্য নির্দিষ্ট কোন ডিরেক্টরীতে ওই নামের ফাইলটি আছে কিনা জানার প্রয়োজন হতে পারে। file_exists স্টেটমেন্টের মাধ্যমে নির্দিষ্ট নামের ফাইলটির অস্তিত্ব সম্পর্কে জানা যায়। যেমন-
$result = file_exists(“stuff.txt”);
এই স্টেটমেন্টটিতে $result ভ্যারিয়েবলটি true অথবা false বুলিয়ান ভ্যালু ধারণ করে। এই ফাংশনগুলো সাধারণত কন্ডিশনাল স্টেটমেন্টে ব্যবহার করা হয়। যেমন-
if(!file_exists(“stuff.txt”))
{
echo “File not found!\n”;
}
উপরের স্টেটমেন্টের মাধ্যমে stuff.txt ফাইলটি আছে নিশ্চিত হওয়ার পর ফাইলটি নিয়ে আরো অন্য কাজ করা যাবে।
নিচের টেবিলে ফাইল সিস্টেম সম্পর্কি পিএইচপির ফাংশনগুলো তুলে ধরা হলো-
ফাংশন | বিবরণ | আউটপুট |
is_file(“stuff.txt”) | একটি রেগুলার ফাইল কিনা তা পরীক্ষা করে। | true অথবা false |
is_dir(“stuff.txt”) | ফাইলটি কোন ডিরেক্টরী কিনা পরীক্ষা করে। | true অথবা false |
is_executable(“do.txt”) | ফাইলটি এক্সিকিউটেবল কিনা পরীক্ষা করে। | true অথবা false |
is_writable(“stuff.txt”) | ফাইলটিতে লেখা যাবে কিনা পরীক্ষা করে। | true অথবা false |
is_readable(“stuff.txt”) | ফাইলটি পড়া যাবে কিনা পরীক্ষা করে। | true অথবা false |
fileatime (“stuff.txt”) | সর্বশেষ কবে কবে এক্সেস করা হয়েছিল। | টাইম স্ট্যাম্প অথবা false |
filectime(“stuff.txt”) | ফাইলটি কখন তৈরি করা হয়েছিল। | টাইম স্ট্যাম্প অথবা false |
filemtime(“stuff.txt”) | ফাইলটি সর্বশেষ কখন মডিফাই করা হয়েছিল। | টাইম স্ট্যাম্প অথবা false |
filegroup(“stuff.txt”) | ফাইলটি গ্রুপ আইডি রিটার্ন দেয়। | ইন্টেজার যা ফাইলের গ্রুপ আইডি অথবা false |
fileowner(“stuff.txt”) | ফাইলটির ওনারের ইউজার আইডি রিটার্ন দেয়। | ইন্টেজার যা একটি ইউজার আইডি অথবা false |
filesize(“stuff.txt”) | বাইট ফরম্যাটে ফাইলের আকার দেখায়। | ইন্টেজার অথবা false |
filetype(“stuff.txt”) | কি ধরণের বা টাইপের ফাইল? | ফাইল টাইপ (যেমন- file, dir, link, char) অথবা false |
basename(“/t1/do.txt”) | পাথটি থেকে ফাইলের নামটি রিটার্ন করে। | do.txt |
dirname(“/t1/do.txt”) | পাথটি থেকে ডিরেক্টরীর নামটি রিটার্ন দেয়। | /t1 |
এছাড়াও আরো ফাংশন রয়েছে। যেমন pathinfo() ফাংশনটি একটি ফাইলের সম্পূর্ণ পাথটি সম্পর্কে তথ্য প্রদান করে। যেমন এই স্টেটমেন্টটি-
$pinfo = pathinfo(“/topdir/nextdir/stuff.txt”);
ফাইল চেকিং অর্থ্যাৎ এই ফাংশনগুলো ব্যবহারের সময় খুবই সাবধান থাকতে হবে যেন ফাইলের নাম বা ডিরেক্টরীর নামের বানানের কোন ভুল না হয়। ফাইল নামের বানানে ভুল হলে স্ক্রিপ্ট নির্দিষ্ট ফাইলটি না পেয়ে false ভ্যালু রিটার্ন করবে।
ফাইল কপি, রিনেম ও ডিলিট করা
কোন ডিরেক্টরীর একটি ফাইলকে আমরা নতুন একটি ফাইলে কপি করতে পারি। একটি ফাইল একই ডিরেক্টরিতে দুটি নামে অথবা একটি ডিরেক্টরীর পাশাপাশি অন্য ডিরেক্টরিতেও কপি করে রাখা হয়। বিশেষত ডাটাবেজ বা গুরুত্বপূর্ণ ফাইল ব্যাকআপ রাখার ক্ষেত্রে এই কপি স্টেটমেন্ট ব্যবহার করা হয়। যেমন-
copy(“fileold.txt”,”filenew.txt”);
এই স্টেটমেন্টটির মাধ্যমে fileold.txt ফাইলটি filenew.txt নামের একটি নতুন ফাইলে কপি হবে। ওই ডিরেক্টরীতে filenew.txt নামের কোন ফাইল থাকলে তা ওভার রাইট হয়ে যাবে। আর ওভার রাইট করতে না চাইলে স্টেটমেন্টটি এভাবে লিখতে হবে-
If(!file_exists(“filenew.txt”))
{
copy(“fileold.txt”,”filenew.txt”);
}
else
{
echo “File already exists!\n”;
}
আমরা চাইলে ফাইলটি নতুন একটি ডিরেক্টরী অর্থ্যাৎ অন্য কোন ফোল্ডারেও কপি করে রাখতে পারি। তাহলে স্টেটমেন্টটি হবে নিচের মতো-
copy(“fileold.txt”,”newdir/filenew.txt”);
নিচের স্টেটমেন্টের মতো রিনেম স্টেটমেন্ট ব্যবহার করেও ফাইল রিনেম করা যায়।
rename(“oldname.txt”,”newname.txt”);
ডিরেক্টরীতে থাকা কোন ফাইলকে রিনেম করতে এই স্টেটমেন্টটি ব্যবহার করলে নিচের মতো সতর্কবার্তা আসবে-
Warning: rename(fileold.txt,filenew.txt): File exists in c:test.php on line 17
অপ্রয়োজনীয় ফাইল ডিলিট করতে unlink স্টেটমেন্ট ব্যবহার করা যায়। যেমন-
unlink(“badfile.txt”);
ফাইল সাজানো বা ফাইল বিন্যাস
ফাইল ফোল্ডারে সাজানো থাকে। এই সেকশনে কিভাবে ডিরেক্টরী তৈরি করা যায়, অপসারণ করা যায় এবং কিভাবে একটি ডিরেক্টরীর সবগুলো ফাইলের তালিকা পাওয়া যায় তা দেখব।
ডিরেক্টরী তৈরি
mkdir ফাংশনের মাধ্যমে ডিরেক্টরী ক্রিয়েট করা হয়। যেমন-
mkdir(“testdir”);
এই স্টেটমেন্টটি স্ক্রিপ্টটি যে ডিরেক্টরীতে রাখা আছে সেখানে testdir নামে একটি ফোল্ডার তৈরি করে। ওই ডিরেক্টরীতে testdir নামে কোন ফোল্ডার থাকলে নিচের মতো সতর্কীকরণ বার্তা দেখাবে-
Warning: mkdir(): File exists in d:/test/test.php on line 5
তাই কোন ডিরেক্টরী তৈরি করার আগে ওই নামে কোন ডিরেক্টরী আছে কিনা তা দেখে নিতে হয়। নিচের স্টেটমেন্টগুলোর মাধ্যমে ডিরেক্টরী যাচাই করা যায়-
If(!is_dir(“mynewdir”))
{
mkdir(“mynewdir”);
}
else
{
echo “Directory already exists!”;
}
ডিরেক্টরী তৈরি করার পর এর ভিতর কপি করে ফাইল রাখতে পারেন। অন্য কোন ডিরেক্টরীর ভিতর নতুন ফোল্ডার তৈরি করতে চাইলে তাও করা যাবে। এজন্য পুরো পাথটি নিচের মতো করে ব্যবহার করতে হবে-
mkdir(“/topdir/nextdir/mynewdir”);
ডিরেক্টরীর সব ফাইলের তালিকা তৈরি
অনেক সময় নির্দিষ্ট একটি ডিরেক্টরীতে কতগুলো ফাইল আছে এবং সেগুলোর তালিকা করার প্রয়োজন হতে পারে। পিএইচপিতে ওয়েব ডেভেলপমেন্ট করার ক্ষেত্রে এটি একটি গুরুত্বপূর্ন কাজ। উদাহরণস্বরূপ আপনি ডাউনলোড ফোল্ডারে রাখা ফাইলগুলোর একটি তালিকা তৈরি করে সেগুলো ইউজারকে ডাউনলোড করার সুযোগ করে দিতে পারেন অথবা নির্দিষ্ট একটি ডিরেক্টরীর ফাইলগুলোর মধ্যে ইমেজ বা গ্রাফিক ফাইলগুলোর তালিকা তৈরি করার প্রয়োজন হতে পারে। এজন্য ডিরেক্টরীকে প্রথম ওপেন করে তা রিড করতে হবে। এজন্য opendir ফাংশন রয়েছে। যেমন-
$dh = opendir(“/topdir/testdir”);
স্টেটমেন্টটিতে উল্লেখিত ডিরেক্টরীটির কোন অস্তিত্ব না থাকলে নিচের মতো সতর্কীকরণ বার্তা ডিসপ্লে করবে।
Warning: opendir(testdir): failed to open dir: Invalid argument in test13.php on line 5
আগের স্টেটমেন্টটিতে ভ্যারিয়েবল $dh একটি পয়েন্টার। এর মাধ্যমে ডিরেক্টরীটি ওপেন হয়েছে। এখন আপনি এই $dh এর মাধ্যমে অর্থ্যাৎ একে পয়েন্টার হিসেবে ব্যবহার করে ডিরেক্টরীটি রিড করতে পারেন। এজন্য readdir ফাংশন ব্যবহার করতে হবে নিচের মতো-
$filename = readdir($dh);
এই স্টেটমেন্টটিতে $filename ভ্যারিয়েবলটি একটি ফাইলের নামকে ধারণ করে। তাই ডিরেক্টরীর সবগুলো ফাইলকে রিড করতে একটি লুপ চালাতে হবে। নিচের মতো আমরা while লুপ ব্যবহার করতে পারি এই স্টেটমেন্টে-
while($filename = readdir($dh))
{
echo $filename.”\n”;
}
এখন আমরা একটি ফোল্ডারে রাখা সবগুলো ছবি (ইমেজ ফাইল) দিয়ে একটি ফটোগ্যালারি তৈরি করব। কাজটি করতে আমরা opendir ও readdir ফাংশন ব্যবহার করবো। নিচের স্ক্রিপ্টটি একটি ফটোগ্যালারি তৈরি করবে-
<?php
/* Script name: displayGallery
* Description: Displays all the image files that are
* stored in a specified directory.
*/
echo “<html><head><title>Image Gallery</title></head>
<body>”;
$dir = “../test1/testdir/”; ➝8
$dh = opendir($dir); ➝9
while($filename = readdir($dh)) ➝10
{
$filepath = $dir.$filename; ➝12
if(is_file($filepath) and ereg(“\.jpg$”,$filename)) ➝13
{
$gallery[] = $filepath;
}
}
sort($gallery); ➝16
foreach($gallery as $image) ➝17
{
echo “<hr />”;
echo “<img src=’$image’ /><br />”;
}
?>
</body></html>
স্ক্রিপ্টটিতে প্রত্যেকটি লাইনের শেষে দেয়া লাইন নম্বরগুলো লক্ষ্য করুণ। লাইন নম্বরগুলোর মাধ্যমে ওই লাইনটি স্ক্রিপ্টে কিভাবে কাজ করেছে তা আলোচনা করা হলো-
এই লাইন ডিরেক্টরীর নামটি ভ্যারিয়েবলে ধারণ করেছে যাকে পয়েন্টার হিসেবে চিহ্নিত করে পরবর্তীতে ব্যবহার করা হবে। আরেকটি বিষয় লক্ষ্য লাখতে হবে ডিরেক্টরীর শেষে / (ব্যাকশ্ল্যাস) ব্যবহার করা হয়েছে। কখনোই / এর পরিবর্তে \ ব্যবহার করা যাবে না।
এই লাইনটি ডিরেক্টরীকে ওপেন করে।
এই লাইন ডিরেক্টরীর প্রতিটি ফাইলের নামকে রিড করার জন্য while লুপটি চালনা করে।
এই লাইনটি ফাইলের পুরো পাথটির জন্য $filepath ভ্যারিয়েবল তৈরি করে।
এই লাইনটি পরীক্ষা করে ফাইলটি .jpg এক্সটেনশনের কোন গ্রাফিক ফাইল কিনা। ফাইলটি .jpg এক্সটেনশনের হলে পুরো ফাইল পাথটি $gallery তে যোগ করে।
এই লাইনটি এ্যারেকে বর্ণনানুক্রমিকভাবে সর্টিং করে। ফলে ছবিগুলো বর্ণনানুক্রমিকভাবে ডিসপ্লে হয়।
এই লাইনটি ছবিগুলোকে পেজে ডিসপ্লে করতে foreach লুপটিকে চালনা করে।
অপারেটিং সিস্টেম কমান্ডের ব্যবহার
অপারেটিং সিস্টেমের সাথে ইন্টারএ্যাক্ট করা পিএইচপির একটি গুরুত্বপূর্ণ বিষয়। এজন্য পিএইচপির অনেক ফাংশন রয়েছে। অপারেটিং সিস্টেম কমান্ডের জন্য পিএইচপির ফাংশনগুলোর ব্যবহার খুবই নিরাপদ ও এগুলো খুবই দ্রুত কাজ করে। পিএইচপিতে অপারেটিং সিস্টেম কমান্ড চালানোর অনেকগুলো পদ্ধতি রয়েছে। যেমন-
- ব্যাকটিকস (backticks): দুটি ` (ব্যাকটিক) এর মাঝের কমান্ডকে পিএইচপি এক্সিকিউট করে এবং তার আউটপুট ডিসপ্লে করে।
- সিস্টেম ফাংশন (system function): এই ফাংশনটি সিস্টেম কমান্ডকে এক্সিকিউট করে আউটপুট দেখায় এবং আউটপুটের শেষ লাইনে পৌছায়।
- ইএক্সইসি ফাংশন (exec function): এই ফাংশনটি সিস্টেম কমান্ডকে এক্সিকিউট করে আউটপুটকে একটি এ্যারেতে সংরক্ষণ করে এবং আউটপুটের শেষ লাইনটিকে রিটার্ন করে।
- পাসথ্রো ফাংশন (passthru function): এই ফাংশনটি সিস্টেম কমান্ডকে এক্সিকিউট করে আউটপুট ডিসপ্লে করে।
তবে সিস্টেম কমান্ড চালানোর ক্ষেত্রে কিছু কিছু বিষয়ের অপারেটিরং সিস্টেমের উপর ভিত্তি করে ব্যতিক্রম হয়। যেমন নিচের কমান্ডগুলো অপারেটিং সিস্টেমের উপর ভিত্তি করে এক্সিকিউট হয়।
ব্যাকটিকের ব্যবহার
সিস্টেম কমান্ড এক্সিকিউট করার একটি সাধারণ পদ্ধতি হলো দুটি (`) ব্যাকটিকের মাঝখানে কমান্ডটিকে ব্যবহার করা। যেমন-
$result = `dir c:\php`;
$result ভ্যারিয়েবল কমান্ডের আউটপুটটি ধারণ করে। ভ্যারিয়েবলটিতে c:\php ডিরেক্টরীতে থাকা সবগুলো ফাইলের তালিকা সংরক্ষিত হয়। তাই $result ভ্যারিয়েবলটি ইকো করলে মোটামুটি এরকম একটি আউটপুট দেখাবে-
Volume in drive C has no label.
Volume Serial Number is 58B2-DBD6
Directory of c:\php
10/10/2013 05:43 PM <DIR> .
10/10/2013 05:43 PM <DIR> ..
10/10/2013 04:53 PM <DIR> dev
10/10/2013 04:53 PM <DIR> ext
10/10/2013 04:53 PM <DIR> extras
08/30/2013 07:11 AM 417,792 fdftk.dll
08/30/2013 07:11 AM 90,112 fribidi.dll
08/30/2013 07:11 AM 346,624 gds32.dll
08/30/2013 07:11 AM 90 go-pear.bat
08/30/2013 07:11 AM 96,317 install.txt
08/30/2013 07:11 AM 1,097,728 libeay32.dll
08/30/2013 07:11 AM 166,912 libmcrypt.dll
08/30/2013 07:11 AM 165,643 libmhash.dll
08/30/2013 07:11 AM 2,035,712 libmysql.dll
08/30/2013 07:11 AM 385,024 libswish-e.dll
08/30/2013 07:11 AM 3,286 license.txt
08/30/2013 07:11 AM 57,344 msql.dll
08/30/2013 07:11 AM 168,858 news.txt
08/30/2013 07:11 AM 278,800 ntwdblib.dll
10/10/2013 04:53 PM <DIR> PEAR
08/30/2013 07:11 AM 41,017 php-cgi.exe
08/30/2013 07:11 AM 32,825 php-win.exe
08/30/2013 07:11 AM 32,821 php.exe
08/30/2013 07:11 AM 2,523 php.gif
08/30/2013 07:11 AM 46,311 php.ini-dist
08/30/2013 07:11 AM 49,953 php.ini-recommended
08/30/2013 07:11 AM 36,924 php5apache.dll
08/30/2013 07:11 AM 36,925 php5apache2.dll
08/30/2013 07:11 AM 36,927 php5apache2_2.dll
08/30/2013 07:11 AM 36,932 php5apache2_filter.dll
08/30/2013 07:11 AM 57,410 php5apache_hooks.dll
08/30/2013 07:11 AM 669,318 php5embed.lib
08/30/2013 07:11 AM 28,731 php5isapi.dll
08/30/2013 07:11 AM 28,731 php5nsapi.dll
08/30/2013 07:11 AM 4,796,472 php5ts.dll
08/30/2013 07:11 AM 86,076 php_mysqli.dll
08/30/2013 07:11 AM 135 pws-php5cgi.reg
08/30/2013 07:11 AM 139 pws-php5isapi.reg
08/30/2013 07:11 AM 1,830 snapshot.txt
08/30/2013 07:11 AM 200,704 ssleay32.dll
35 File(s) 11,569,880 bytes
6 Dir(s) 180,664,549,376 bytes free
অপারেটিং সিস্টেমে safe_mode সক্রিয় করা থাকলে ব্যাকটিক অপারেটর কাজ করবে না। কিছু ক্ষেত্রে পিএইচপি ইনস্টল করার সময় ডিফল্ট ভাবে safe_mode বন্ধ করা থাকে। তবে সিস্টেমের এডমিনিস্ট্রেটর এই ভ্যালু নিজের মতো করে পরিবর্তন করতে পারেন।
সিস্টেম ফাংশনের ব্যবহার
সিস্টেম ফাংশন সিস্টেম কমান্ড এক্সিকিউট করে আউটপুট ডিসপ্লে করে এবং আউটপুটের শেষ লাইনটিকে ডিসপ্লে রিটার্ন করে। যেমন নিচের স্টেটমেন্টটি-
$result = system(“dir c:\php”);
এই স্টেটমেন্টটি এক্সিকিউট হওয়ার সময় ডিরেক্টরীর ফাইল লিস্ট দেখাতে থাকে এবং $result ভ্যারিয়েবলে শেষ লাইনটি রাখে। তাই $result ইকো করলে নিচের মতো দেখাবে-
11 Dir(s) 566,263,808 bytes free
ইএক্সইসি ফাংশনের ব্যবহার
exec ফাংশন একটি সিস্টেম কমান্ডকে এক্সিকিউট করে। কিন্তু কোন আউটপুট ডিসপ্লে করে না। আউটপুটটিকে একটি এ্যারেতে সংরক্ষণ করে। আউটপুটের প্রতিটি লাইন একেকটি ইলিমেন্ট হিসেবে এ্যারেতে সংরক্ষিত হয়।
কোন সময় হয়তো নির্দিষ্ট একটি ডিরেক্টরীতে কতগুলো ফাইল আছে এবং কত বাইট জায়গা খালি আছে তা জানার প্রয়োজন হতে পারে। নিচের স্টেটমেন্টটির মাধ্যমে আউটপুট কোন এ্যারেতে না রেখেও কমান্ডটি এক্সিকিউট করা যায়।
$result = exec(“dir c:\php”);
কমান্ডটি এক্সিকিউট হলে কোন আউটপুট ডিসপ্লে করে না। কারণ স্টেটমেন্টটিতে আউটপুটের শেষ লাইনটি ভ্যারিয়েবলে ধারণ করা হয়েছে। সুতরাং আউটপুট ডিসপ্লে করার জন্য ভ্যারিয়েবলটিকে ইকো করলে নিচের মতো আউটপুট দেখাবে-
11 Dir(s) 566,263,808 bytes free
এটি dir কমান্ডের আউটপুটের শেষ লাইনটিকে আউটপুট হিসেবে দেখায়। আপনি ইচ্ছা করলে কমান্ডের সম্পুর্ন আউটপুটটিকে একটি এ্যারেতে সংরক্ষণ করতে পারেন। এভাবে-
$result = exec(“dir c:\php”,$dirout);
foreach($dirout as $line)
{
echo “$line\n”;
}
$dirout এ্যারেটি ডিরেক্টরীর ফাইলের তালিকার প্রতিটি লাইনকে ধারণ করে। তাই লুপটি নিচের মতো আউটপুট ডিসপ্লে করে-
Volume in drive C has no label.
Volume Serial Number is 394E-15E5
Directory of c:\php
10/10/2013 05:43 PM <DIR> .
10/10/2013 05:43 PM <DIR> ..
10/10/2013 04:53 PM <DIR> dev
10/10/2013 04:53 PM <DIR> ext
10/10/2013 04:53 PM <DIR> extras
08/30/2013 07:11 AM 417,792 fdftk.dll
পাসথ্রো ফাংশনের ব্যবহার
পাসথ্রো ফাংশনটি একটি সিস্টেম কমান্ডকে এক্সিকিউট করে এবং কমান্ডটি যা রিটার্ন করে তাই ডিসপ্লে হয়। একটি পাসথ্রো ফাংশন এক্সিকিউট করতে নিচের স্টেটমেন্টটি ব্যবহার করুন-
passthru(“dir c:\php”);
এই স্টেটমেন্টটি ডিরেক্টরীর ফাইলের তালিকা তৈরি করলেও কোন আউটপুট দেখায় না। এমনটি ডাটা সংরক্ষণ করার জন্য এখানে কোন ভ্যারিয়েবলও ব্যবহার করা হয়নি। সাধারণত বাইনারি আউটপুটের প্রয়োজন হলে এই পাসথ্রো ফাংশন ব্যবহার করা হয়।
সিস্টেম কমান্ডের এরর মেসেজ
সিস্টেম কমান্ড এক্সিকিউট করার সময় এটি যেকোন কারণে এক্সিকিউট করতে ব্যর্থ হলে পিএইচপি সাধারণত কোন তথ্যগত এরর মেসেজ বা ত্রুটি বার্তা দেখায় না। কমান্ডটি এক্সিকিউট করার পর কাঙ্খিত ফলাফল না পেলে বুঝতে হবে কমান্ডটি এক্সিকিউট হয়নি বা কোন ত্রুটি হয়েছে। কিন্তু কোথায় কি ত্রুটি হয়েছে তা জানতে পারবেন না। কারণ এটি কোন এরর মেসেজ দেখায় না।
তাই সিস্টেম কমান্ডের এরর মেসেজ ডিসপ্লে করতে চাইলে কমান্ডে কিছু বাড়তি ক্যারেক্টার যোগ করতে হবে। যেমন 2>&1 স্ট্রিংটি সিস্টেম কমান্ডের শেষে যোগ করে দিলে স্টেটমেন্টটি এক্সিকিউট করতে ব্যর্থ হলেই এরর মেসেজ দেখাবে। যেমন-
$result = system(“di c:\php”);
এই সিস্টেম কমান্ডটি এক্সিকিউট হলে সিস্টেম ফাংশনটি আউটপুট দেখাবে না। লক্ষ্য করলে দেখা যাবে dir বানানটি ভুল হয়েছে। আসলে di নামে কোন সিস্টেম কমান্ডের অস্তিত্ব না থাকায় কমান্ডটি এক্সিকিউট হবে না। কিন্তু এক্সিকিউট না হওয়ার বিষয়ে কোন বার্তাও দেখাবে না। এজন্য এই স্টেটমেন্টটিকে নিচের মতো করে লিখলে এরর মেসেজ প্রদর্শন করবে।
$result = system(“di c:\php 2>&1”);
ফলে এরর মেসেজটি হবে এরকম-
‘di’ is not recognized as an internal or external command, operable program or batch file.
2>&1 লেখার সময় অবশ্যই লক্ষ্য রাখতে হবে যে, ক্যারেক্টারগুলোর মাঝখানে কোন স্পেস যেন না থাকে।
নিরাপত্তা
একটি সিস্টেম কমান্ড এক্সিকিউট করা মানে ব্যবহারকারীকে আপনার কম্পিউটারে কোন এ্যাকশন ঘটাতে দেয়া বা কাজ করার অধিকার দেয়া। যেমন- dir c:\php কমান্ডটি আপনার কম্পিউটারে চালানো হলে আপনি হয়তো বলবেন- কোন সমস্যা নাই। কিন্তু rm /bin/* অথবা del c:\*.* কমান্ডটি আপনার কম্পিউটারে চালানো হলে আপনি কি বলবেন? অবশ্যই খুশি হবেন না। তাই সিস্টেম কমান্ড চালনা খুবই সতর্কতার সাথে করতে হবে।
যে সব ফরমে ব্যবহারকারীর কাছ থেকে ডাটা গ্রহণ করা হয়, এধরনের ফরমে সিস্টেম কমান্ড ব্যবহার করার সময় অবশ্যই খুব সাবধানতা অবলম্বন করতে হবে। উদাহরণস্বরূপ আপনি একটি এপ্লিকেশন তৈরি করেছেন যার মাধ্যমে ব্যবহারকারী ফরমে একটি নাম টাইপ করবে এবং ডাটাবেজে ওই নামে একটি ডিরেক্টরী তৈরি হবে। যার জন্য নিচের মতো একটি স্ক্রিপ্ট লিখলেন-
$directoryName = $_POST[‘directoryName’];
exec(“mkdir $directoryName”);
এখানে $directoryName = Sabina হলে এবং কমান্ডটি এক্সিকিউট হলে Sabina নামে একটি ডিরেক্টরী তৈরি হবে। তাহলে এটি কোন সমস্যা নয়। কিন্তু যদি ব্যবহারকারী $directoryName এর ঘরে ভুল বশতঃ Sabina, rm * লিখে ফেলে? এই কমান্ডটি এক্সিকিউট হলে Sabina নামে একটি ডিরেক্টরী তৈরি হবে এবং সেই সাথে বর্তমানে ডিরেক্টরীতে থাকা সব ফাইল রিমুভ হয়ে যাবে।