نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی
  • خانه
  • اخبار
  • php فایل را در متغیر بارگذاری می کند. اسکریپت فایل - چگونه یک فایل PHP را در یک متغیر بارگذاری کنیم؟ انتخاب باشماست

php فایل را در متغیر بارگذاری می کند. اسکریپت فایل - چگونه یک فایل PHP را در یک متغیر بارگذاری کنیم؟ انتخاب باشماست

$Vdata = file_get_contents("textfile.txt");

اما الان باید یک فایل PHP آپلود کنم.

حدس می زنم می خواهید چه چیزی به دست آورید محتوای تولید شده توسط PHP، اگر چنین است:

$Vdata = file_get_contents("http://YOUR_HOST/YOUR/FILE.php");

در غیر این صورت اگر بخواهید کد منبع فایل PHP، این همان فایل txt است:

$Vdata = file_get_contents("path/to/YOUR/FILE.php");

ob_start(); شامل "yourfile.php"; $myvar = ob_get_clean();

اگر استفاده می کنید http://همانطور که توسط eye پیشنهاد شده است، شما فقط می توانید خروجی اسکریپت PHP را بخوانید. فقط در صورتی می توانید یک اسکریپت PHP را بخوانید که روی همان سروری باشد که اسکریپت شما قرار دارد. سپس می توانید از چیزی مانند استفاده کنید

$Vdata = file_get_contents("/path/to/your/file.php");

اگر می خواهید فایلی را بدون اجرای آن از طریق وب سرور دانلود کنید، موارد زیر باید کار کنند.

$string = eval(file_get_contents("file.php"));

سپس محتویات فایل بارگذاری می شود. فایل PHP باید به طور کامل با برچسب ها تشکیل شودبرای ارزیابی برای ارزیابی آن.

در تئوری شما فقط می توانید از fopen استفاده کنید و سپس از stream_get_contents استفاده کنید.

$stream = fopen("file.php","r"); $string = stream_get_contents($stream); fclose($stream);

از طرف دیگر، می‌توانید بافر کردن خروجی را شروع کنید، یک شامل / نیاز را انجام دهید و سپس بافر را متوقف کنید. با ob_get_contents() می توانید به سادگی مواردی را که توسط یک فایل PHP دیگر در یک متغیر منتشر شده است دریافت کنید.

file_get_contents() اگر سرور شما کار کند کار نخواهد کرد allow_url_fopen را غیرفعال کرد. اکثر میزبان های وب اشتراکی به دلیل خطرات امنیتی به طور پیش فرض غیرفعال هستند. علاوه بر این، در PHP6گزینه allow_url_fopenدیگر وجود نخواهد داشت و همه ویژگی ها به گونه ای عمل می کنند که گویی برای همیشه غیرفعال شده اند. بنابراین استفاده از این روش بسیار بد است.

بهترین مورد استفاده شما اگر از طریق http به فایل دسترسی دارید، cURL است

قبل از تلاش برای کار با یک فایل، بهتر است از وجود آن اطمینان حاصل کنید. برای حل این مشکل معمولا از دو تابع استفاده می شود:

file_exists() و is_file().

تابع file_exists() بررسی می کند که آیا فایل داده شده وجود دارد یا خیر. اگر فایل وجود داشته باشد، تابع TRUE و در غیر این صورت FALSE را برمی گرداند. سینتکس تابع file_exists() به صورت زیر است:

bool file_exists (فایل رشته)

نمونه ای از بررسی وجود یک فایل:

اگر (!file_exists($filename)) :

چاپ "فایل $filename وجود ندارد!";

is_file()

تابع is_file() وجود یک فایل معین و توانایی انجام عملیات خواندن/نوشتن روی آن را بررسی می کند. اساسا، is_file() نسخه قوی تری از file_exists() است که نه تنها وجود فایل را بررسی می کند، بلکه می تواند داده ها را بخواند و بنویسد:

bool is_file (فایل رشته)

مثال زیر نشان می دهد که چگونه می توان تأیید کرد که یک فایل وجود دارد و آیا می توان عملیات را روی آن انجام داد:

$file = "somefile.txt";

if (is_file ($file)):

چاپ "فایل $file معتبر است و وجود دارد!";

چاپ "فایل $file وجود ندارد یا یک فایل معتبر نیست!";

پس از اطمینان از وجود فایل مورد نظر و انجام عملیات های مختلف خواندن/نوشتن با آن، می توانید به مرحله بعدی یعنی باز کردن فایل بروید.

تابع filesize() اندازه (بر حسب بایت) فایل را با نام داده شده یا FALSE در صورت خطا برمی گرداند. سینتکس تابع fileize() به صورت زیر است:

اندازه فایل int (نام فایل رشته)

فرض کنید می خواهید اندازه فایل pastry.txt را تعیین کنید. برای بدست آوردن اطلاعات مورد نیاز می توانید از تابع fileize() استفاده کنید:

$fs = fileize("pastry.txt"); چاپ "Pastry.txt $fs بایت است.";

نتیجه زیر نمایش داده می شود:

Pastry.txt 179 بایت است.

قبل از انجام عملیات روی یک فایل، باید آن را باز کرده و با یک دسته فایل مرتبط کنید و پس از پایان کار با فایل، باید آن را ببندید. در بخش بعدی به این موضوعات پرداخته شده است.

باز کردن و بستن فایل ها

قبل از انجام عملیات I/O روی یک فایل، باید با تابع ()fopen باز شود.

تابع fopen() فایل را باز می کند (در صورت وجود) و یک عدد صحیح را برمی گرداند - به اصطلاح دسته فایل(دسته پرونده). سینتکس تابع fopen() به صورت زیر است:

int fopen (فایل رشته، حالت رشته[، int include_path])

فایلی که باز می شود می تواند در سیستم فایل محلی قرار داشته باشد، به عنوان ورودی/خروجی استاندارد وجود داشته باشد، یا فایلی را در یک سیستم راه دور که توسط HTTP یا FTP پذیرفته شده است را نشان دهد.

پارامتر فایل می تواند چندین شکل داشته باشد که در زیر ذکر شده است:

اگر پارامتر حاوی نام یک فایل محلی باشد، تابع fopen() آن فایل را باز می کند و یک handle را برمی گرداند.

اگر پارامتر روی php://stdin، php://stdout یا php://stderr تنظیم شود، جریان ورودی/خروجی استاندارد مربوطه باز می شود.

اگر پارامتر با پیشوند http:// شروع شود، تابع یک اتصال HTTP را به سرور باز می کند و یک دسته برای فایل مشخص شده برمی گرداند.

اگر پارامتر با پیشوند ftp:// شروع شود، تابع یک اتصال FTP به سرور باز می کند و یک دسته برای فایل مشخص شده برمی گرداند. در این مورد، باید به دو مورد توجه ویژه داشته باشید: اگر سرور از حالت منفعل FTP پشتیبانی نمی کند، فراخوانی ()fopen با شکست مواجه می شود. علاوه بر این، فایل های FTP یا برای خواندن یا برای نوشتن باز می شوند.

هنگامی که در حالت غیرفعال کار می کند، سرور LR منتظر اتصالات مشتریان می ماند. هنگام کار در حالت فعال، سرور خود با مشتری ارتباط برقرار می کند. حالت پیش فرض معمولاً حالت فعال است.

پارامتر mode تعیین می کند که آیا می توان فایل را از روی آن خواند یا نوشت. روی میز. 7.1 مقادیری را فهرست می کند که حالت باز کردن فایل را تعیین می کند.

جدول 7.1. حالت های باز کردن فایل

حالت شرح
فقط خواندن. نشانگر موقعیت فعلی روی ابتدای فایل تنظیم شده است
r+ خواندن و نوشتن. نشانگر موقعیت فعلی روی ابتدای فایل تنظیم شده است
w فقط ضبط نشانگر موقعیت فعلی روی ابتدای فایل تنظیم می شود و کل محتوای فایل از بین می رود. اگر فایل وجود نداشته باشد، تابع سعی می کند آن را ایجاد کند.
w+ خواندن و نوشتن. نشانگر موقعیت فعلی روی ابتدای فایل تنظیم می شود و کل محتوای فایل از بین می رود. اگر فایل وجود نداشته باشد، تابع سعی می کند آن را ایجاد کند.
آ فقط ضبط نشانگر موقعیت فعلی در انتهای فایل تنظیم شده است. اگر فایل وجود نداشته باشد، تابع سعی می کند آن را ایجاد کند.
a+ خواندن و نوشتن. نشانگر موقعیت فعلی در انتهای فایل تنظیم شده است. اگر فایل وجود نداشته باشد، تابع سعی می کند آن را ایجاد کند.

اگر پارامتر سوم اختیاری include_path 1 باشد، مسیر فایل نسبت به دایرکتوری include مشخص شده در فایل php.ini است (به فصل 1 مراجعه کنید).

در زیر نمونه ای از باز کردن یک فایل با تابع ()fopen است. فراخوانی ()die، که همراه با fopen() استفاده می‌شود، در صورت باز نشدن فایل، پیام خطا را چاپ می‌کند:

$file = "userdata.txt"; // برخی از فایل ها

$fh = fopen($file, "a+") or die("فایل ($file) وجود ندارد!");

قطعه زیر یک اتصال به یک سایت PHP (http://www.php.net) را باز می کند:

$site = "http://www.php.net": // سرور قابل دسترسی از طریق HTTP

$sh = fopen($site., "r"); //دستکاری کننده را با صفحه فهرست Php.net مرتبط کنید

پس از تکمیل، فایل همیشه باید با تابع fclose() بسته شود.

تابع fclose() یک فایل را با دسته داده شده می بندد. در موفقیت TRUE، در شکست FALSE را برمی‌گرداند. سینتکس تابع fclose() به صورت زیر است:

int fclose (دستکاری کننده int)

تابع fclose() با موفقیت فقط فایل هایی را می بندد که قبلاً توسط توابع ()fopen یا fsockopen() باز شده بودند. نمونه ای از بستن یک فایل:

$file = "userdata.txt";

if (file_exists ($file)) :

$fh = fopen($file, "r");

// انجام عملیات فایل

چاپ "فایل فایل وجود ندارد!"؛

در فایل بنویسید

دو عملیات اساسی بر روی فایل های باز انجام می شود - خواندن و نوشتن.

تابع is_writeable() تأیید می کند که فایل وجود دارد و قابل نوشتن است. قابلیت نوشتن هم برای فایل و هم برای دایرکتوری بررسی می شود. نحو تابع is_writeable() به صورت زیر است:

bool is_writeable (فایل رشته ای)

یک نکته مهم: PHP به احتمال زیاد تحت شناسه کاربری استفاده شده توسط وب سرور (معمولا "هیچکس") اجرا می شود. مثالی از استفاده از is_writeable() در توضیحات تابع fwrite() آورده شده است.

تابع fwrite() محتویات یک متغیر رشته را در فایل مشخص شده توسط دسته فایل می نویسد. نحو تابع fwrite() به صورت زیر است:

int fwrite (دستکاری کننده int، متغیر رشته [، طول int])

اگر یک پارامتر طول اختیاری هنگام فراخوانی تابع ارسال شود، ضبط یا پس از نوشتن تعداد مشخص شده کاراکترها یا زمانی که به انتهای رشته رسیده است متوقف می شود. بررسی توانایی نوشتن در یک فایل در مثال زیر نشان داده شده است:

// اطلاعاتی در مورد ترافیک سایت کاربر

$data = "08:13:00|12:37:12|208.247.106.187|Win98";

$filename = "somefile.txt";

// اگر فایل وجود داشته باشد و بتوان آن را نوشت

if (is_writeable ($filename)) :

$fh = fopen($filename, "a+");

// محتویات $data را در یک فایل بنویسید

$success - fwrite($fh، $data);

// بستن فایل

fclose($fh); دیگر:

چاپ "نام فایل برای نوشتن باز نشد"؛

تابع ()fputs نام مستعار fwrite() است و می تواند در هر جایی که از fwrite() استفاده شود استفاده شود.

تابع ()fputs نام مستعار fwrite() است و دقیقاً همان نحو را دارد. سینتکس تابع fputs() به صورت زیر است:

int fputs (دستکاری کننده int، متغیر رشته [، طول int])

من شخصا ترجیح می دهم از fputs() استفاده کنم. به خاطر داشته باشید که این فقط یک موضوع سبک است و ربطی به تفاوت بین این دو عملکرد ندارد.

خواندن از روی یک فایل

بدون شک خواندن مهمترین عملیاتی است که روی فایل ها انجام می شود. برخی از ویژگی هایی که کارایی خواندن از روی یک فایل را بهبود می بخشد در زیر توضیح داده شده است. نحو این توابع تقریباً دقیقاً سینتکس توابع ضبط مشابه را کپی می کند.

تابع i s_readable() به شما این امکان را می دهد که مطمئن شوید فایل وجود دارد و عملیات خواندن برای آن مجاز است. خوانایی هم برای فایل و هم برای دایرکتوری بررسی می شود. نحو تابع is_readable() به صورت زیر است:

هو is_readable (فایل رشته)

به احتمال زیاد، PHP تحت شناسه کاربری استفاده شده توسط وب سرور (معمولاً "nobody") اجرا می شود، بنابراین برای اینکه تابع is_readable() TRUE را بازگرداند، همه باید اجازه داشته باشند از فایل بخوانند. مثال زیر نشان می دهد که چگونه می توان تأیید کرد که یک فایل وجود دارد و قابل خواندن است:

if (is_readable($filename)) :

// فایل را باز کنید و نشانگر موقعیت فعلی را در انتهای فایل تنظیم کنید

$fh = fopen($filename, "r");

چاپ "$filename قابل خواندن نیست!";

تابع fread() تعداد مشخص شده بایت را از فایل مشخص شده توسط دسته فایل می خواند. نحو تابع fwrite() به صورت زیر است:

int fread (دستکاری کننده int، طول int)

دستکاری کننده باید به یک فایل قابل خواندن باز مراجعه کند (به توضیحات تابع is_readable() مراجعه کنید). خواندن پس از خواندن تعداد مشخص شده بایت یا زمانی که فایل به پایان می رسد متوقف می شود. فایل متنی pastry.txt نشان داده شده در لیست 7.1 را در نظر بگیرید. خواندن و خروجی این فایل در مرورگر توسط قطعه زیر انجام می شود:

$fh = fopen("pastry.txt"، "r") or die("نمی توان فایل را باز کرد!");

$file = fread($fh، حجم فایل($fh));

با استفاده از تابع ()fllesize برای تعیین اندازه pastry.txt بر حسب بایت، مطمئن می شوید که تابع ()fread کل محتویات فایل را می خواند.

فهرست 7.1. فایل متنی pastry.txt

دستور تهیه: خمیر شیرینی

1 1/4 فنجان آرد همه منظوره

3/4 چوب (6 قاشق غذاخوری) کره بدون نمک، خرد شده

2 قاشق غذاخوری شیرین کننده سبزیجات 1/4 قاشق چایخوری نمک

3 قاشق غذاخوری آب

تابع fgetc() رشته ای حاوی یک کاراکتر از فایل در موقعیت اشاره گر فعلی یا FALSE را در صورت رسیدن به انتهای فایل برمی گرداند. سینتکس تابع fgetc() به صورت زیر است:

رشته fgetc (دستکاری کننده int)

دستکاری کننده باید به یک فایل قابل خواندن باز مراجعه کند (توضیحات تابع is_readable() را قبلا در این فصل ببینید). مثال زیر خواندن و خروجی یک فایل کاراکتر به کاراکتر را با استفاده از تابع ()fgetc نشان می دهد:

$fh = fopen("pastry.txt"، "r"); در حالی که (!feof($fh)):

$char = fgetc($fh):

چاپ $char; بی پایان

تابع fgets () رشته خوانده شده را از موقعیت فعلی اشاره گر در فایل مشخص شده توسط filehandle برمی گرداند. نشانگر فایل باید به یک فایل قابل خواندن باز اشاره کند (توضیحات تابع is_readable() را در ابتدا در این فصل ببینید). نحو تابع fgets() :

رشته fgets (دستکاری کننده int، طول int)

خواندن زمانی متوقف می شود که یکی از شرایط زیر برآورده شود:

  • خواندن از طول فایل -- 1 بایت.
  • یک کاراکتر خط جدید از فایل (شامل رشته برگشتی) خوانده شد.
  • پایان فایل (EOF) از فایل خوانده شده است.

اگر می خواهید فایل را خط به خط بخوانید، مقداری را در پارامتر دوم ارسال کنید که آشکارا از تعداد بایت های خط بیشتر است. نمونه ای از خواندن و خروجی خط به خط یک فایل:

$fh = fopen("pastry.txt"، "r");

در حالی که (!feof($fh));

$line = fgets ($fh, 4096)؛

خط $ چاپ کنید. "
";

تابع fgetss () دقیقاً مشابه fgets () است با یک استثنا - سعی می کند تمام تگ های HTML و PHP را از متن خوانده شده حذف کند:

رشته fgetss (دستکاری کننده Int، طول int [، رشته مجاز_برچسب ها])

قبل از رفتن به مثال ها، نگاهی به لیست 7.2 بیندازید -- این فایل در لیست های 7.3 و 7.4 استفاده می شود.

لیست 7.2. فایل Science.html

آخرین اخبار - علم

شکل حیات بیگانه کشف شد


20 اوت 2000

اوایل صبح امروز، شکل جدیدی از قارچ در حال رشد در کمد یخچال قدیمی آپارتمان W. J. Gilmore پیدا شد. مشخص نیست که آیا تشعشعات قدرتمندی که از مانیتور رایانه مستاجر ساطع می شود به این تکامل کمک کرده است یا خیر.

لیست 7.3. حذف برچسب ها از فایل HTML قبل از نمایش در مرورگر

$fh = fopen("science.html"، "r");

در حالی که (!feof($fh)):

چاپ fgetss ($fh، 2048)؛

نتیجه در پاین نشان داده شده است. همانطور که می بینید، تمام تگ های HTML از فایل Science.html حذف شده اند و در نتیجه قالب بندی از بین می رود:

در برخی شرایط، همه تگ ها از فایل حذف می شوند، به جز برخی از آنها - به عنوان مثال، برچسب های شکست خط
. فهرست 7.4 نشان می دهد که چگونه این کار انجام می شود.

لیست 7.4. حذف انتخابی برچسب ها از یک فایل HTML

$fh = fopenC"science.html"، "r");

$allowable="
";

در حالی که (!feof($fh)):

print fgetss ($fh. 2048, $allowable);

نتیجه:

آخرین اخبار - شکل حیات بیگانه Science Alien در 20 آگوست کشف شد. 2000 اوایل صبح امروز، شکل جدیدی از قارچ در حال رشد در کمد یخچال آپارتمان قدیمی WJ Gilmore کشف شد. سیر تکاملی.

همانطور که می بینید، تابع fgetss () تبدیل فایل ها را آسان می کند، به خصوص اگر تعداد زیادی فایل HTML با فرمت مشابه داشته باشید.

خواندن یک فایل در یک آرایه

تابع file() کل محتویات یک فایل را در یک آرایه نمایه شده بارگذاری می کند. هر عنصر آرایه مربوط به یک خط از فایل است. سینتکس تابع file() به صورت زیر است:

فایل آرایه (فایل رشته[, int include_path])

اگر پارامتر سوم اختیاری include_path 1 باشد، مسیر فایل نسبت به دایرکتوری include مشخص شده در فایل php.ini است (به فصل 1 مراجعه کنید). لیست 7-5 از تابع file() برای بارگیری فایل pastry.txt استفاده می کند (به لیست 7-1 مراجعه کنید).

$file_array = file("pastry.txt");

while (list($line_num. $line) = eacht($file_array)):

چاپ" خط$line_num:"، htmlspecialchars($line)،"
\n"

هر ردیف از آرایه به همراه یک عدد خروجی می شود:

خط 0: دستور غذا: خمیر شیرینی

خط 1: 1 1/4 فنجان آرد همه منظوره

خط 2: 3/4 چوب (6 قاشق غذاخوری) کره بدون نمک، خرد شده

خط 3: 2 قاشق غذاخوری شورتنینگ سبزیجات

خط 4: 1/4 قاشق چایخوری نمک

خط 5: 3 قاشق غذاخوری آب

تغییر مسیر یک فایل به خروجی استاندارد

تابع readfile() محتویات یک فایل را می خواند و آن را در خروجی استاندارد (در بیشتر موارد، در مرورگر) می نویسد. سینتکس تابع readfile() به صورت زیر است:

int readfile (فایل رشته[, int include_path])

تابع تعداد بایت های خوانده شده را برمی گرداند. فایل می تواند در سیستم فایل محلی قرار داشته باشد، به عنوان ورودی/خروجی استاندارد وجود داشته باشد، یا فایلی را بر روی یک سیستم راه دور که توسط HTTP یا FTP پذیرفته شده است را نشان دهد. پارامتر فایل مطابق با قوانین تابع ()fopen تنظیم می شود.

فرض کنید یک فایل latore.txt دارید که می خواهید در مرورگر نمایش دهید:

رستوران "La Torre." واقع در نتتونو، ایتالیا، ترکیبی از سبک را ارائه می دهد. تاریخ، و غذاهای دریایی خوب. در داخل دیوارهای بورگوی قرون وسطایی اطراف شهر، می‌توان در حین تماشای خرید عابران در بوتیک‌های روستا، شام خورد. راحتی همراه با تازه ترین غذاهای دریایی، La Torre را به یکی از بهترین رستوران های ایتالیا تبدیل کرده است.

هنگامی که قطعه زیر اجرا می شود، کل محتوای latorre.txt به جریان خروجی استاندارد ارسال می شود:

$restaurant_file = "latorre.txt";

// کل فایل را به خروجی استاندارد ارسال کنید

readfile($restaurant_file);

باز کردن پرونده یک فرآیند

همراه با فایل‌های معمولی، می‌توانید فایل‌هندل‌ها را برای تعامل با فرآیندهای روی سرور باز کنید. مشکل توسط تابع popen() که دارای دستور زیر است حل می شود:

int popen (فرمان رشته، حالت رشته)

پارامتر فرمان دستور سیستم را برای اجرا مشخص می کند و پارامتر mode حالت دسترسی را توصیف می کند:

// فایل "spices.txt" را برای نوشتن باز کنید

$fh = fopen("spices.txt"،"w");

// چند خط متن اضافه کنید

fputs($fh، "جعفری، مریم گلی، رزماری\n");

fputs($fh، "پاپریکا، نمک، فلفل\n");

fputs($fh، "ریحان، مریم گلی، زنجبیل\n");

// Close Manipulator

// یک فرآیند grep یونیکس را برای جستجوی کلمه Basil در spices.txt باز کنید

$fh - popen("grep ریحان< spices.txt", "r");

// خروجی grep را چاپ کنید

نتیجه به این شکل است:

ریحان، مریم گلی، زنجبیل

تابع ()fpassthru مشابه تابع passthru() است که در بخش "اجرای برنامه های خارجی" این فصل بحث شده است.

پس از اتمام تمام عملیات، فایل یا فرآیند باید بسته شود. تابع pclose() اتصال به فرآیند مشخص شده توسط دسته را می بندد، مشابه نحوه بستن تابع fclose() فایلی که توسط تابع fopen() باز می شود. نحو تابع ()pclose:

int pclose (دستکاری کننده int)

در پارامتر دستکاری کنندهدستکاری کننده ای که قبلاً از یک فراخوانی موفق ()popen به دست آمده بود، ارسال می شود.

باز کردن اتصال سوکت

PHP به تعامل با فایل ها و فرآیندها محدود نمی شود -- شما همچنین می توانید اتصالات سوکت ایجاد کنید. سوکت(سوکت) یک انتزاع نرم افزاری است که به شما امکان می دهد با سرویس های مختلف در رایانه دیگری ارتباط برقرار کنید.

تابع fsockopen() یک اتصال سوکت به یک سرور در اینترنت برقرار می کند

از طریق پروتکل TCP یا UDP. سینتکس تابع fsockopen() به صورت زیر است:

int fsockopen (گره رشته، پورت int [، int error_code [، string error_text [، int timeout]]])

پارامترهای اختیاری error_code و error_text حاوی اطلاعاتی هستند که در صورت عدم اتصال به سرور نمایش داده می شوند. هر دو پارامتر باید توسط مرجع ارسال شوند. سومین پارامتر اختیاری، timeout، مدت زمان انتظار برای پاسخ از طرف سرور (در ثانیه) را مشخص می کند. لیست 7-6 نحوه استفاده از تابع ()fsockopen را برای به دست آوردن اطلاعات در مورد سرور نشان می دهد. با این حال، قبل از نگاه کردن به لیست 7.6، یک تابع دیگر وجود دارد که باید معرفی شود، socket_set_blocking().

UDP (User Datagram Protocol) یک پروتکل ارتباطی است که اتصال گرا نیست.

socket_set_blocking()

تابع socket_set_b1ocki ng() به شما اجازه می دهد تا کنترل های زمان بندی را برای عملیات سرور تنظیم کنید:

socket_set_blocking (Int manipulator، mode boolean)

پارامتر مانیپولاتور سوکتی را که قبلاً باز شده است مشخص می کند و پارامتر حالت حالتی را که سوکت به آن سوئیچ می کند (در حالت مسدود کردن، نادرست برای حالت غیر مسدود) انتخاب می کند. نمونه ای از استفاده از توابع fsockopen() و socket_set_blocking() در لیست 7.6 نشان داده شده است.

لیست 7.6. با استفاده از تابع fsockopen() برای دریافت اطلاعات سرور

تابع getthehost($host.$path) (

// اتصال به گره را باز کنید

$fp - fsockopen($host, 80, &$errno, &$errstr, 30);

// به حالت مسدود کردن بروید

socket_set_blocking ($fp، 1)،

// ارسال سرصفحه

fputs($fp,"GET $path HTTP/1.1\r\n");

fputs ($fp، "میزبان: $host\r\n\r\n"); $x = 1;

// هدرها را دریافت کنید

در حالی که ($x< 10) :

$headers = fgets ($fp, 4096);

// Close Manipulator

getthehost("www.apress.com"، "/");

فهرست 7.6 نتیجه زیر را ایجاد می کند:

سرور HTTP/1.1 200 OK: Microsoft-IIS/4.0 Content-location:

2000 20:25:06 GMT برچسب ET: "f0a61666dbff1bf1:34a5" طول محتوا: 1311

تابع ()pfsockopen یک نسخه ثابت از ()fsockopen است. این بدان معنی است که با پایان یافتن اسکریپتی که تابع در آن فراخوانی شده است، اتصال به طور خودکار قطع نمی شود. نحو تابع ()pfsockopen:

int pfsockopen (میزبان رشته، پورت int [، int error_code [، string error_text [، int timeout]]])

بسته به اهداف خاص برنامه شما، ممکن است استفاده از pfsockopen() به جای fsockopen() راحت تر باشد.

راه اندازی برنامه های خارجی

اسکریپت‌های PHP همچنین می‌توانند برنامه‌های موجود در سرور را اجرا کنند. این ویژگی به ویژه هنگام مدیریت سیستم از طریق یک مرورگر وب و همچنین برای به دست آوردن راحت تر اطلاعات خلاصه در مورد سیستم استفاده می شود.

تابع exec() برنامه داده شده را اجرا می کند و آخرین خط خروجی آن را برمی گرداند. سینتکس تابع exec() به صورت زیر است:

string exec (فرمان رشته [، آرایه رشته [، بازگشت int]])

لطفاً توجه داشته باشید که تابع exec() فقط دستور را اجرا می کند و نتایج کار خود را خروجی نمی دهد. تمام خروجی های فرمان را می توان در یک پارامتر آرایه اختیاری ذخیره کرد. همچنین، اگر یک متغیر بازگشتی نیز در هنگام تعیین پارامتر آرایه مشخص شود، به دومی کد بازگشتی دستور اجرا شده اختصاص داده می شود.

فهرست 7.7 نحوه استفاده از تابع exec() را برای اجرای تابع پینگ سیستم یونیکس نشان می دهد.

لیست 7.7. بررسی ارتباط با سرور با استفاده از تابع ()exec

exec("ping -c 5 www.php.net", $ping);

// در ویندوز، exec("ping -n 5 www.php.net. $ping);

برای ($i=0; $i< count($ping);$i++) :

چاپ"
$ping[$i]";

نتیجه:

PING www.php.net (208.247.106.187): 56 بایت داده

64 بایت از 208.247.106.187: icmp_seq=0 ttl=243 time=66.602 ms

64 بایت از 208.247.106.187: icmp_seq=1 ttl=243 time=55.723 ms

64 بایت از 208.247.106.187: icmp_seq=2 ttl=243 time=70.779 ms

64 بایت از 208.247.106.187: icmp_seq=3 ttl=243 time=55.339 ms

64 بایت از 208.247.106.187: icmp_seq=4 ttl=243 time=69.865 ms

آمار پینگ www.php.net --

5 بسته ارسال شد. 5 بسته دریافت شد. 0% از دست دادن بسته

رفت و برگشت min/avg/max/stddev - 55.339/63.662/70.779/6.783 ms

بکتیک

راه دیگری برای اجرای دستورات سیستم وجود دارد که نیازی به فراخوانی توابع ندارد - فرمان اجرا شده در بکتیک (``) محصور می شود و نتایج کار آن در مرورگر نمایش داده می شود. مثال:

چاپ"

خروجی $
";

این قطعه محتوای دایرکتوری که اسکریپت در آن قرار دارد را در مرورگر چاپ می کند.

پارامتر داخلی ping -c 5 (-n 5 در سیستم ویندوز) تعداد دفعات نظرسنجی از سرور را مشخص می کند.

اگر فقط می خواهید خروجی خام یک دستور را برگردانید، از تابع passthru() که در زیر توضیح داده شده است استفاده کنید.

تابع passthru () تقریباً مانند exec () عمل می کند، با یک استثنا - به طور خودکار نتایج فرمان را خروجی می دهد. نحو تابع passthru() به صورت زیر است:

void passthru (فرمان رشته [, int return])

اگر پارامتر بازگشتی اختیاری در فراخوانی passthru() ارسال شود، این متغیر روی کد بازگشتی دستور اجرا شده تنظیم می‌شود.

escapeshellcmd()

تابع ()escapeshellcmd از همه کاراکترهای بالقوه خطرناکی که کاربر ممکن است وارد کند (به عنوان مثال، در فرم HTML) برای اجرای دستورات exec()، passthru()، system() یا ()popen می گریزد. نحو:

string escapeshellcmd (فرمان رشته)

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

$user_input = `rm -rf *`; // دایرکتوری والد و همه زیر شاخه های آن را حذف کنید

exec($user_input); // $user_input را اجرا کنید!!!

اگر اقدامات احتیاطی انجام نشود، چنین دستوری منجر به فاجعه می شود. با این حال، می توانید از توابع escapeshellcmd() برای فرار از ورودی کاربر استفاده کنید:

$user_input = `rm - rf *`; // دایرکتوری والد و همه زیر شاخه های آن را حذف کنید

exec(escapeshellcmd($user_input)); // فرار از شخصیت های خطرناک

تابع escapeshellcmd() از کاراکتر * فرار می کند تا از عواقب فاجعه بار اجرای دستور جلوگیری کند.

امنیت یکی از مهمترین جنبه های برنامه نویسی در وب است، بنابراین من یک فصل کامل را به این موضوع و ارتباط آن با برنامه نویسی PHP اختصاص داده ام. برای اطلاعات بیشتر به فصل 16 مراجعه کنید.

کار با فایل سیستم

PHP دارای توابعی برای مشاهده و انجام عملیات های مختلف بر روی فایل های روی سرور است. اطلاعات مربوط به ویژگی های فایل سرور (محل، مالک و امتیازات) اغلب مفید است.

تابع basename() نام فایل را از نام کامل ارسال شده استخراج می کند. نحو تابع basename() به صورت زیر است:

نام پایه رشته (نام کامل رشته)

استخراج نام فایل پایه از نام کامل به صورت زیر انجام می شود:

$path = "/usr/local/phppower/htdocs/index.php"; $file = basename($path); // $file = "index.php"

در واقع این تابع مسیر را از نام کامل حذف می کند و فقط نام فایل را باقی می گذارد.

تابع getlastmod() آخرین تاریخ و زمان تغییر صفحه ای که تابع از آن فراخوانی شده است را برمی گرداند. نحو تابع getlastmod() به صورت زیر است:

int getlastmod (باطل)

مقدار برگشتی با فرمت تاریخ/زمان یونیکس مطابقت دارد و می توانید از تابع date() برای قالب بندی آن استفاده کنید. قطعه زیر تاریخ آخرین تغییر صفحه را چاپ می کند:

echo "آخرین تغییر: ".date("H:i:s a". getlastmod());

تابع stat() یک آرایه قابل نمایه سازی را با اطلاعات دقیق در مورد فایل با نام داده شده برمی گرداند:

آرایه آمار (نام فایل رشته)

اطلاعات زیر در عناصر آرایه برگردانده می شود:

0 دستگاه

2 حالت حفاظت از گره شاخص

3 تعداد پیوندها

4 شناسه کاربری مالک

5 شناسه گروه مالک

6 نوع دستگاه Inode

7 اندازه بر حسب بایت

8 زمان آخرین دسترسی

9 زمان آخرین اصلاح

10 آخرین زمان اصلاح

11 اندازه بلوک برای ورودی/خروجی در سیستم فایل

12 تعداد بلوک های اختصاص داده شده

بنابراین، اگر می خواهید بدانید آخرین بار چه زمانی به فایل دسترسی داشته اید، به عنصر 8 آرایه برگشتی نگاه کنید. یک مثال را در نظر بگیرید:

$file - "datafile.txt";

لیست ($dev، $inode، $inodep، $nlink، $uid، $gid، $inodev، $size، $atime، $mtime، $ctime،

$bsize) = stat ($file);

چاپ "$file $size بایت است.
";

چاپ "آخرین زمان دسترسی: $atime
";

چاپ "آخرین زمان اصلاح: $mtime
";

نتیجه:

popen.php 289 بایت است.

آخرین زمان دسترسی: 15 اوت 2000 ساعت 12:00:00

آخرین زمان اصلاح: 15 اوت 2000، 10:07:18 صبح

در این مثال، من از ساختار list() برای نامگذاری هر مقدار بازگشتی استفاده کرده ام. البته، شما می توانید به خوبی یک آرایه را برگردانید، عناصر را حلقه بزنید و تمام اطلاعات مورد نیاز خود را نمایش دهید. همانطور که می بینید، تابع stat() به شما اجازه می دهد تا اطلاعات مفید مختلفی در مورد یک فایل دریافت کنید.

نمایش و تغییر ویژگی های فایل ها

هر فایل در سیستم های خانواده یونیکس دارای سه ویژگی مهم است:

  • متعلق به یک گروه؛
  • مالک؛
  • مجوزها

همه این ویژگی ها را می توان با استفاده از توابع مناسب PHP تغییر داد. ویژگی های توضیح داده شده در این بخش در سیستم های خانواده ویندوز کار نمی کند.

اگر با سیستم عامل های یونیکس تازه کار هستید، اطلاعات مربوط به ویژگی های سیستم فایل یونیکس را می توانید در http://sunsite.auc.dk/linux-newbie/FAQ2.htm بیابید. موضوعات مالکیت گروهی، مالکیت و مجوزها در بخش 3.2.6 پوشش داده شده است.

تابع chgrp() سعی می کند گروهی را که فایل داده شده به آن تعلق دارد تغییر دهد. نحو تابع chgrp():

int chgrp (نام فایل رشته، گروه ترکیبی)

تابع filegroup() شناسه گروه صاحب فایل را با نام داده شده یا FALSE در صورت خطا برمی گرداند. سینتکس تابع filegroup() به صورت زیر است:

گروه فایل int (نام فایل رشته)

تابع chmod() مجوزهای یک فایل با نام داده شده را تغییر می دهد. نحو تابع chmod() به صورت زیر است:

int chmod (نام فایل رشته، مجوزهای int)

مجوزها به صورت اکتال مشخص شده اند. مشخصات تنظیم پارامتر تابع chmod () در مثال زیر نشان داده شده است:

chmod("data_file.txt"، g+r); // کار نمی کند

chmod("data_file.txt"، 766); // کار نمی کند

chmod("data_file.txt"، 0766); // کار کردن

تابع fileperms () مجوزهای فایل را با نام داده شده یا خطای FALSE برمی گرداند. سینتکس تابع fileperms() به صورت زیر است:

int fileperms (نام فایل رشته)

تابع chown() سعی می کند مالک یک فایل را تغییر دهد. حق تغییر مالک یک فایل فقط به یک کاربر ممتاز داده می شود. نحو تابع chown() به صورت زیر است:

int chown (نام فایل رشته، کاربر مختلط)

تابع fileowner() شناسه کاربری را برای صاحب فایل با نام داده شده برمی گرداند. سینتکس تابع fileowner() به صورت زیر است:

مالک فایل int (نام فایل رشته)

کپی و تغییر نام فایل ها

سایر عملکردهای مفید سیستم که اسکریپت های PHP می توانند انجام دهند شامل کپی و تغییر نام فایل ها در سرور است. این عملیات توسط دو تابع copy() و rename() انجام می شود.

کپی کردن یک فایل در یک اسکریپت PHP به اندازه استفاده از دستور cp یونیکس آسان است. مشکل با تابع copy() PHP حل می شود. نحو تابع copy() به صورت زیر است:

کپی int (منبع رشته، مقصد رشته)

تابع copy() سعی می کند فایل منبع را در فایل مقصد کپی کند. در مورد موفقیت TRUE، در صورت شکست FALSE را برمی گرداند. اگر فایل مورد نظر وجود نداشته باشد، تابع copy() آن را ایجاد می کند. مثال زیر نحوه پشتیبان گیری از یک فایل را با استفاده از تابع copy() نشان می دهد:

$data_file = "data.txt";

copy($data_file. $data_file".bak") یا die("نمی توان $data_file را کپی کرد");

تابع rename() یک فایل را تغییر نام می دهد. در موفقیت TRUE، در شکست FALSE را برمی‌گرداند. نحو تابع rename():

تغییر نام bool (رشته old_name، رشته new_name)

مثالی از تغییر نام یک فایل با تابع ()rename:

$data_file = "data.txt";

تغییر نام ($data file, $datafile".old") یا die ("نام فایل $data تغییر نام داده نشد");

حذف فایل ها

تابع unlink () فایلی با نام داده شده را حذف می کند. نحو:

int unlink (فایل رشته)

اگر با PHP روی یک سیستم ویندوز کار می کنید، هنگام استفاده از این تابع مشکلاتی وجود دارد. در این مورد، می توانید از تابع system() که در بالا توضیح داده شد استفاده کنید و فایل را با دستور DOS del حذف کنید:

system("del filename.txt");

کار با دایرکتوری ها

توابع PHP به شما این امکان را می دهند که محتویات دایرکتوری ها را مشاهده کرده و در میان آنها پیمایش کنید. فهرست 7.8 یک ساختار دایرکتوری یونیکس معمولی را نشان می دهد.

لیست 7.8. ساختار دایرکتوری معمولی

تابع dirname() مکمل basename() -- مسیر را از نام فایل کاملا واجد شرایط استخراج می کند. نحو تابع dirname():

نام رشته (مسیر رشته)

مثالی از استفاده از dirname() برای استخراج یک مسیر از یک نام کاملا واجد شرایط:

$path = "/usr/locla/phppower/htdocs/index.php";

$file = dirname($path); // $file = "usr/local/phppower/htdocs"

تابع dirname() گاهی همراه با متغیر $SCRIPT_FILENAME برای دریافت مسیر کامل اسکریپتی که دستور از آن اجرا می شود استفاده می شود:

$dir - dirname($SCRIPT_FILENAME);

تابع is_dir() بررسی می کند که آیا فایل با نام داده شده یک دایرکتوری است یا خیر:

bool is_dir (نام فایل رشته)

مثال زیر از ساختار دایرکتوری فهرست 7.8 استفاده می کند:

$ isdir = is_dir("index.html"); // FALSE را برمی‌گرداند

$isdir = is_dir("کتاب"); // TRUE را برمی‌گرداند

تابع mkdir() همانند دستور یونیکس با همین نام عمل می کند - یک دایرکتوری جدید ایجاد می کند. سینتکس تابع mkdir() به صورت زیر است:

int mkdir (مسیر رشته، حالت int)

پارامتر path مسیر ایجاد دایرکتوری جدید را مشخص می کند. فراموش نکنید که پارامتر را با نام دایرکتوری جدید پایان دهید! پارامتر mode مجوزهای اختصاص داده شده به دایرکتوری ایجاد شده را تعیین می کند.

همانطور که تابع ()fopen یک دسته را برای یک فایل معین باز می کند، تابع opendir نیز یک دسته را برای یک دایرکتوری باز می کند. سینتکس تابع opendir() به صورت زیر است:

int opendir (مسیر رشته)

تابع ()closedir دسته دایرکتوری ارسال شده به عنوان پارامتر را می بندد. نحو تابع ()closedir:

void closeir(int directory_manipulator)

تابع readdir() عنصر بعدی دایرکتوری داده شده را برمی گرداند. نحو:

string readdir(int directory_manipulator)

با استفاده از این تابع، می توانید به راحتی تمام فایل ها و زیر شاخه ها را در فهرست فعلی فهرست کنید:

$dh = opendir(" .);

در حالی که ($file = readdir($dh)) :

چاپ "$file
"؛ پایان

تابع chdir () درست مانند دستور cd یونیکس کار می کند، به این ترتیب که به دایرکتوری مشخص شده توسط پارامتر تغییر می کند. نحو تابع ()chdir:

int chdir (دایرکتوری رشته ای)

در مثال زیر به دایرکتوری کتاب/فرعی رفته و محتوای آن را نمایش می دهیم:

$newdir = "کتاب";

chdir($newdir) or die("نمی توان به دایرکتوری تغییر داد ($newdir)"); $dh = opendir(" . ");

while ($file = readdir($dh)) ;

چاپ "$file
";

تابع rewlnddir () نشانگر موقعیت فعلی را در ابتدای دایرکتوری باز شده توسط تابع opendir () تنظیم می کند. نحو تابع rewinddir():

void rewinddir(int dir_nipulator)

پروژه 1: یک ضربه شمار ساده

اسکریپت ارائه شده در این بخش تعداد بازدیدها را برای صفحه ای که در آن قرار دارد می شمارد. قبل از رفتن به کد در لیست 7-9، الگوریتم نوشته شده در شبه کد را مرور کنید:

  1. متغیر $access را به نام فایلی که مقدار شمارنده را ذخیره می کند، تنظیم کنید.
  2. از تابع file() برای خواندن محتوای $access در آرایه $visits استفاده کنید. پیشوند @ قبل از نام تابع، خطاهای احتمالی را سرکوب می کند (به عنوان مثال، عدم وجود فایلی با نام داده شده).
  3. متغیر $current_visitors را روی مقدار اولین (و تنها) عنصر آرایه $visits تنظیم کنید.
  4. ارزش $current_visitors را 1 افزایش دهید.
  5. فایل $access را برای نوشتن باز کنید و نشانگر موقعیت فعلی را روی ابتدای فایل تنظیم کنید.
  6. مقدار $current_visitors را در فایل $access بنویسید.
  7. بازکننده مربوط به فایل $access را ببندید.

لیست 7.9. شمارشگر ضربه ساده

// سناریو: شمارنده ضربه ساده

// هدف: ذخیره تعداد بازدیدها در فایل

$access = "hits.txt"; // نام فایل به صورت دلخواه انتخاب می شود

$current_visitors = $visits; // اولین (و تنها) عنصر را بازیابی کنید

++$current_visitors; // افزایش شمارنده ضربه

$fh = fopen($access. "w"); // فایل hits.txt را باز کرده و تنظیم کنید

// اشاره گر به موقعیت فعلی در ابتدای فایل

@fwrite($fh، $current_visitors);// مقدار شمارنده جدید بنویسید

// برای فایل "hits.txt"

fclose($fh); // دسته فایل "hits.txt" را ببندید

پروژه 2: ساخت نقشه سایت

اسکریپت در لیست 7-10 یک نقشه سایت ایجاد می کند، یک نمایش سلسله مراتبی از تمام پوشه ها و فایل های روی سرور، که از یک فهرست مشخص شروع می شود. هنگام محاسبه تورفتگی عناصر تشکیل دهنده نقشه سایت، از توابع تعریف شده در این فصل و فصل قبل استفاده می شود. قبل از شروع برنامه، الگوریتم نوشته شده در شبه کد را مرور کنید:

  1. متغیرهای سرویس را برای ذخیره دایرکتوری والد، نام فایل گرافیکی با تصویر پوشه، نام صفحه و پرچم سیستم عامل سرور (ویندوز یا سیستم دیگر) اعلام کنید.
  2. یک تابع display_directory() که محتویات یک دایرکتوری را می خواند و آن را برای نمایش در مرورگر قالب بندی می کند، اعلام کنید.
  3. مسیر دایرکتوری را با الحاق نام ارسال شده در متغیر $dir1 با $dir بسازید.
  4. دایرکتوری را باز کنید و محتویات آن را بخوانید. نام دایرکتوری ها و فایل ها را فرمت کرده و در مرورگر نمایش دهید.
  5. اگر فایل فعلی یک دایرکتوری است، تابع display_directory() را به صورت بازگشتی فراخوانی کرده و نام دایرکتوری جدید را برای نمایش ارسال کنید. تورفتگی استفاده شده هنگام قالب بندی خروجی را محاسبه کنید.

اگر فایل دایرکتوری نباشد، برای نمایش به صورت هایپرلینک فرمت می شود (و تورفتگی استفاده شده در قالب بندی نیز محاسبه می شود).

لیست 7.10. برنامه sitemap.php

// فایل: sitemap.php

// هدف: ساخت نقشه سایت

// دایرکتوری که از آن می توان ساخت نقشه را شروع کرد

$beg_path = "C:\Program FilesVApache Group\Apache\htdocs\phprecipes";

// فایل با یک تصویر گرافیکی از پوشه.

// مسیر باید نسبی* به دایرکتوری ریشه سرور آپاچی باشد

$folder_location = "C:\My Documents\PHP for Programmers\FINAL CHPS\graphics\folder.gif";

// متن در عنوان پنجره $page_name = "PHPRecipes SiteMap";

// در کدام سیستم از اسکریپت استفاده می شود - لینوکس یا ویندوز؟

// (0 - ویندوز؛ 1 - لینوکس)

$usingjinux = 0;

// تابع: display_directory

// هدف: خواندن محتویات دایرکتوری مشخص شده توسط پارامتر

// $dir1 و سپس قالب بندی سلسله مراتب دایرکتوری ها و فایل ها.

// تابع را می توان به صورت بازگشتی فراخوانی کرد.

تابع display_directory ($dir1، $folder_location، $using_linux، $init_depth) (

// مسیر به روز رسانی

sdh = opendir($dir);

while($file = readdir($dh)) :

// عناصر دایرکتوری "." و ".." خروجی نیستند.

if (($file != ".") && ($file != "..")) :

اگر ($using_linux == 0) :

$depth = explode("\\", $dir): else:

$depth = explode("/", $dir); endif; $curtent_depth = sizeof($depth);

// مسیر را طبق قوانین سیستم عامل مورد استفاده بسازید. اگر ($using_linux == 0) :

$tab_depth = $current_deptn - $init_depth;

$file = $dir. "\\", $file; دیگر:

$file = $dir. "/",$file; endif;

// آیا متغیر $file حاوی دایرکتوری است؟ if (dir($file)) است:

// محاسبه padding

در حالی که ($x< ($tab_depth * 2)) :

$x++; بی پایان

چاپ"

".basename($file)."
";

// شمارنده افزایشی

// فراخوانی بازگشتی به تابع display_directory().

display_directory ($file، $folder_location، $using_linux، $init_depth);

// دایرکتوری نیست

// مسیر را طبق قوانین مورد استفاده بسازید

// سیستم عامل.

اگر ($using_linux == 0) :

$tab_depth = ($current_depth - $init_depth) - 2; $x = 0;

// محاسبه padding

در حالی که ($x< (($tab_depth * 2) + 5)) :

چاپ" ".basename($file)."
";

چاپ" ".basename($file)."
";

endif; // Is_dir(پرونده) endif: // اگر ! "." یا ".."

// بستن دایرکتوری closeir($dh);

<? print "$page_name"; ?>

// محاسبه padding اولیه

اگر ($using_linux == 0) :

$depth = explode("\\", $beg_path);

$depth = explode("/", $beg_path);

$init_depth = sizeof($depth);

display_directory ($beg_path، $folder_location، $using_linux، $init_depth);

روی انجیر شکل 7.1 خروجی اسکریپت یک کاتالوگ را با چندین فصل در این کتاب نشان می دهد.

برنج. 7.1. نمایش ساختار دایرکتوری روی سرور با استفاده از اسکریپت sitemap.php

نتایج

در این فصل بسیاری از ابزارهای PHP برای کار با فایل ها معرفی شده است. به ویژه سؤالات زیر را در نظر گرفتیم:

  • بررسی وجود فایل ها؛
  • باز کردن و بستن فایل ها و جریان های ورودی/خروجی؛
  • نوشتن روی یک فایل و خواندن از آن؛
  • تغییر مسیر فایل به جریان خروجی؛
  • راه اندازی برنامه های خارجی؛
  • عملیات سیستم فایل

مطالب این فصل زمینه را برای فصل بعدی، رشته ها و عبارات با قاعده فراهم می کند، زیرا پردازش رشته و عملیات I/O در توسعه برنامه های کاربردی وب بسیار مرتبط هستند.

آخرین به روز رسانی: 1.11.2015

مانند بسیاری از زبان های برنامه نویسی، PHP از فایل ها پشتیبانی می کند که یکی از راه های ذخیره سازی اطلاعات است.

خواندن و نوشتن فایل ها

باز کردن و بستن فایل ها

تابع fopen() در PHP برای باز کردن فایل ها تعریف شده است. این تعریف زیر را دارد: منبع fopen (رشته $filename، string $mode) . پارامتر اول $filename نشان دهنده مسیر فایل و پارامتر دوم نشان دهنده حالت باز شدن است. بسته به هدف باز کردن و نوع فایل، این پارامتر می تواند مقادیر زیر را داشته باشد:

    "r" : فایل به صورت فقط خواندنی باز می شود. اگر فایل وجود نداشته باشد، false را برمی گرداند

    "r+" : فایل به صورت فقط خواندنی و قابل نوشتن باز می شود. اگر فایل وجود نداشته باشد، false را برمی گرداند

    "w" : فایل برای نوشتن باز می شود. اگر چنین فایلی از قبل وجود داشته باشد، بازنویسی می شود، اگر نه، آنگاه ایجاد می شود.

    "w+" : فایل برای نوشتن با خوانایی باز می شود. اگر چنین فایلی از قبل وجود داشته باشد، بازنویسی می شود، اگر نه، آنگاه ایجاد می شود.

    "a" : فایل برای نوشتن باز می شود. اگر چنین فایلی از قبل وجود داشته باشد، داده ها در انتهای فایل نوشته می شوند و داده های قدیمی باقی می مانند. اگر فایل وجود نداشته باشد، ایجاد می شود

    "a+" : فایل برای خواندن و نوشتن باز می شود. اگر فایل از قبل وجود داشته باشد، داده ها به انتهای فایل اضافه می شوند. اگر فایل وجود نداشته باشد، ایجاد می شود

نتیجه تابع fopen یک توصیفگر فایل است. این دسته برای عملیات روی فایل و برای بستن آن استفاده می شود.

پس از اتمام، فایل باید با استفاده از تابع fclose() بسته شود که یک توصیفگر فایل را به عنوان پارامتر می گیرد. به عنوان مثال، اجازه دهید یک فایل را باز و بسته کنیم:

$fd = fopen("form.php"، "r") یا die("فایل باز نشد"); fclose($fd);

ساختار or die ("متن خطا") به شما این امکان را می دهد که اسکریپت را خاتمه دهید و اگر تابع fopen قادر به باز کردن فایل نبود، پیام خطا را نمایش دهید.

خواندن یک فایل

برای خواندن یک فایل می توان از چندین تابع استفاده کرد. برای خواندن خط به خط، از تابع ()fgets استفاده می شود که یک توصیفگر فایل را می گیرد و یک خط خوانده شده را برمی گرداند. بیایید خط به خط کل فایل را مرور کنیم:

هر بار که fgets() را فراخوانی می کنید، PHP یک اشاره گر را در انتهای رشته خوانده شده قرار می دهد. برای ردیابی پایان یک فایل، از تابع feof() استفاده می شود که با پایان یافتن فایل، مقدار true را برمی گرداند. و تا پایان فایل می توانیم از تابع fgets() استفاده کنیم.

خواندن کل فایل

در این حالت، نیازی نیست که فایل را به صراحت باز کنیم، یک دسته بگیریم و سپس فایل را ببندیم.

مسدود کردن خواندن

شما همچنین می توانید یک خواندن بلوک به بلوک انجام دهید، یعنی تعداد معینی از بایت ها را از یک فایل با استفاده از تابع fread() بخوانید:

تابع fread() دو پارامتر دارد: توصیفگر فایل برای خواندن و تعداد بایت هایی که باید خوانده شوند. هنگام خواندن یک بلوک، نشانگر فایل به انتهای این بلوک منتقل می شود. و همچنین با کمک تابع feof () می توانید تکمیل فایل را پیگیری کنید.

فایل بنویس

برای نوشتن یک فایل از تابع fwrite() استفاده می شود که یک رشته در فایل می نویسد:

تابع دیگر fputs() به طور مشابه کار می کند:

کار با نشانگر فایل

هنگام باز کردن فایل برای خواندن یا نوشتن در حالت "w"، نشانگر فایل در ابتدا قرار می گیرد. هنگام خواندن داده ها، PHP نشانگر فایل را به انتهای بلوک داده های خوانده شده منتقل می کند. با این حال، ما همچنین می توانیم به صورت دستی نشانگر را در فایل دستکاری کرده و آن را در یک مکان دلخواه تنظیم کنیم. برای این کار باید از تابع استفاده کنید fseek، که دارای تعریف رسمی زیر است:

int fseek (منبع $handle , int $offset [, int $whence = SEEK_SET ])

پارامتر $handle یک دسته فایل را نشان می دهد. پارامتر $offset مقداری است که بر حسب بایت نسبت به ابتدای فایلی که خواندن/نوشتن از آن شروع می شود، فاصله دارد. سومین پارامتر اختیاری نحوه تنظیم افست را مشخص می کند. می تواند سه مقدار داشته باشد:

    SEEK_SET: مقدار پیش‌فرض، مقدار افست را بر روی بایت‌های آفست از ابتدای فایل تنظیم می‌کند

    SEEK_CUR : افست را به گونه ای تنظیم می کند که بایت ها را نسبت به شروع موقعیت فعلی در فایل تغییر دهد.

    SEEK_END : افست را به گونه ای تنظیم می کند که بایت های انتهای فایل را جایگزین کند

اگر نشانگر با موفقیت تنظیم شود، تابع fseek () 0 و در صورت شکست -1 را برمی‌گرداند.

مثالی از استفاده از تابع:

$fd = fopen("hello.txt"، "w+") or die("فایل باز نشد"); $str = "سلام دنیا!"; // رشته برای نوشتن fwrite ($fd, $str); // رشته را در ابتدای fseek بنویسید($fd, 0); // نشانگر فایل را در ابتدای fwrite قرار دهید ($fd, "Oink"); // خط را در ابتدای fseek بنویسید($fd, 0, SEEK_END); // نشانگر را در انتهای fwrite قرار دهید ($fd, $str); // یک خط دیگر در انتهای fclose($fd) بنویسید.

دانلود $_ (8)

من باید یک فایل PHP را در یک متغیر بارگذاری کنم. به عنوان مثال include();

من یک فایل html ساده مثل این آپلود کردم:

$Vdata = file_get_contents("textfile.txt");

اما الان باید یک فایل PHP آپلود کنم.

پاسخ ها

اگر فایل شما دارای عبارت بازگشت است:

"Afeganistão"، "ZA" => "África do Sul"، ... "ZW" => "Zimbabué");

شما می توانید این متغیر را به صورت زیر دریافت کنید:

$data = شامل $filePath;

از طرف دیگر، می‌توانید بافر کردن خروجی را شروع کنید، یک شامل / نیاز را انجام دهید و سپس بافر را متوقف کنید. با ob_get_contents() می توانید به سادگی مواردی را که توسط یک فایل PHP دیگر در یک متغیر منتشر شده است دریافت کنید.

اگر می خواهید فایلی را بدون اجرای آن از طریق وب سرور دانلود کنید، موارد زیر باید کار کنند.

$string = eval(file_get_contents("file.php"));

سپس محتویات فایل بارگذاری می شود. فایل PHP باید به طور کامل با برچسب ها تشکیل شودبرای ارزیابی برای ارزیابی آن.

حدس می زنم می خواهید چه چیزی به دست آورید محتوای تولید شده توسط PHP، اگر چنین است:

$Vdata = file_get_contents("http://YOUR_HOST/YOUR/FILE.php");

در غیر این صورت اگر بخواهید کد منبع فایل PHP، این همان فایل txt است:

$Vdata = file_get_contents("path/to/YOUR/FILE.php");

در تئوری شما فقط می توانید از fopen استفاده کنید و سپس از stream_get_contents استفاده کنید.

$stream = fopen("file.php","r"); $string = stream_get_contents($stream); fclose($stream);

اگر استفاده می کنید http://همانطور که توسط eye پیشنهاد شده است، شما فقط می توانید خروجی اسکریپت PHP را بخوانید. فقط در صورتی می توانید یک اسکریپت PHP را بخوانید که روی همان سروری باشد که اسکریپت شما قرار دارد. سپس می توانید از چیزی مانند استفاده کنید

$Vdata = file_get_contents("/path/to/your/file.php");

در اینجا نحوه انجام آن است (راه های زیادی وجود دارد):

  1. تبدیل داده به JSON
  2. زنگ زدن AJAXبرای دریافت فایل JSON
  3. دگرگونی JSONبه یک شی جاوا اسکریپت

مرحله 1

connect_error) ( die("اتصال ناموفق: " . $conn->connect_error); ) $sql = "انتخاب شناسه، نام، تصویر از تلفن"; $result = $conn->query($sql); while($row =$result->fetch_assoc())($v=$row; ) echo json_encode($v); $conn->close(); ?>

گام 2

تابع showUser(fnc) ( var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() ( if (this.readyState == 4 && this.status == 200) (// STEP 3 var p=JSON.parse( this.responseText))))

(PHP 4 >= 4.3.0، PHP 5، PHP 7)

file_get_contents- محتویات یک فایل را در یک رشته می خواند

شرح

رشته file_get_contents (رشته $filename [, bool $use_include_path = نادرست [, منبع $context [, int $offset = -1 [, int $maxlen ]]]])

این تابع مشابه تابع است فایل()تنها با این تفاوت که file_get_contents()محتویات فایل را به صورت رشته ای برمی گرداند که از مقدار افست مشخص شده شروع می شود و تا حداکثر بایت می رسد. در صورت شکست، file_get_contents()بر خواهد گشت نادرست.

استفاده از عملکرد file_get_contents()اگر نیاز به دریافت کل محتویات فایل دارید، ترجیح داده می شود، زیرا برای بهبود عملکرد، این تابع از تکنیک نگاشت فایل در حافظه (نقشه برداری حافظه) استفاده می کند، در صورتی که توسط سیستم عامل شما پشتیبانی می شود.

اظهار نظر:

اگر یک URI حاوی کاراکترهای خاص مانند فاصله باز می کنید، باید URI را با آن کدگذاری کنید urlencode().

لیست پارامترها

نام فایل در حال خواندن

Use_include_path

اظهار نظر:

از PHP 5، می توانید از ثابت استفاده کنید FILE_USE_INCLUDE_PATHبرای جستجوی یک فایل در مسیر include.

متن نوشته

منبع زمینه معتبر ایجاد شده توسط تابع stream_context_create(). اگر نیازی به استفاده از زمینه خاصی نیست، می توانید با ارسال مقدار به آن، این پارامتر را نادیده بگیرید خالی.

افستی که از آن می توان شروع به خواندن جریان اصلی کرد.

جستجوی افست هنگام کار با فایل های راه دور پشتیبانی نمی شود. تلاش برای یافتن یک افست در فایل‌های غیر محلی ممکن است برای آفست‌های کوچک کار کند، اما این نتیجه غیرقابل پیش‌بینی است زیرا روی یک جریان بافر کار می‌کند.

حداکثر اندازه داده ای که باید خوانده شود. پیش فرض این است که تا پایان فایل خوانده شود. توجه داشته باشید که این تنظیم برای یک جریان دارای فیلتر نیز اعمال می شود.

ارزش های بازگشتی

تابع داده های خوانده شده یا را برمی گرداند نادرستدر صورت بروز خطا

توجه

این تابع می تواند به صورت بولی برگردد نادرست، و یک مقدار غیر بولی که به آن ریخته می شود نادرست. برای اطلاعات بیشتر به نوع Boolean مراجعه کنید. از عملگر === برای تست مقدار برگشتی توسط این تابع استفاده کنید.

اشتباهات

خطای سطح ایجاد خواهد شد E_WARNINGاگر پارامتر نام فایل پیدا نشود، پارامتر حداکثر طول کمتر از صفر است، یا جستجو در offset در جریان ناموفق است.

مثال ها

مثال شماره 1 کد منبع صفحه اصلی وب سایت را دریافت و نمایش دهید

$homepage = file_get_contents("http://www.example.com/" );
echo $homepage ;
?>

مثال شماره 2 یافتن فایل ها در include_path

// <= PHP 5
$file = file_get_contents("./people.txt" , true );
// > PHP 5
$file = file_get_contents("./people.txt" , FILE_USE_INCLUDE_PATH );
?>

مثال شماره 3 خواندن بخشی از یک فایل

// خواندن 14 کاراکتر، از نویسه 21 شروع می شود
$section = file_get_contents ("./people.txt" , NULL , NULL , 20 , 14 );
var_dump ($section);
?>

نتیجه اجرای این مثال چیزی شبیه به این خواهد بود:

رشته (14) "lle Bjori Ro"

Beispiel شماره 4 با استفاده از زمینه های جریان

// یک موضوع ایجاد کنید
$opts = آرایه(
"http" =>آرایه(
"method" => "GET" ,
"header" => "Accept-language: en\r\n" .
"کوکی: foo=bar\r\n"
);

$context = stream_context_create($opts );

// فایل را با استفاده از هدرهای HTTP در بالا باز کنید
$file = file_get_contents ("http://www.example.com/" , false , $context );
?>

Close_notify. PHP در لحظه ای که به پایان داده ها برسید، این را به عنوان "SSL: Fatal Protocol Error" گزارش می کند. برای حل این مشکل، باید error_reporting را روی سطحی تنظیم کنید که E_WARNING را مستثنی کند. نسخه‌های PHP 4.3.7 و بالاتر می‌توانند تشخیص دهند که IIS مشکل‌ساز در سمت سرور هنگام باز کردن یک جریان با استفاده از wrapper است. https://و هشداری را نمایش نمی دهد. اگر استفاده می کنید fsockopen()برای ایجاد ssl://سوکت، شما مسئول شناسایی و سرکوب این هشدار هستید.

برترین مقالات مرتبط