مقدمه ای بر PHP Streams. پورتال اطلاعات امنیتی ایجاد موضوع php postid

مقدمه ای بر PHP Streams. پورتال اطلاعات امنیتی ایجاد موضوع php postid

یکی از مهمترین و محبوب ترین وظایف در PHP، انتقال اطلاعات است. احتمالاً بیش از یک بار با آدرس اینترنتی مانند این مواجه شده اید site.ru/page.php?id=114841یا فرم با فیلدهای ورودیمتن (ثبت نام، نظر جدید و غیره). در این درس و درس های بعدی در مورد آن صحبت خواهیم کرد انتقال داده به PHP.

روش POST در PHP

این روش از دو بخش تشکیل شده است: HTML با فرم و فیلدها و یک فایل PHP handler.

توجه! برای کار، فقط باید بر اساس آن ایجاد کنیم فقط دو فایل.

تظاهرات دانلود منابع
بیایید به یک مثال با نظرات نگاه کنیم - اجرای مجوز کاربر در یک وب سایت:

کد HTML(فایل post.html)



فرم





ورود شما:

رمز عبور شما:





اکنون بیشتر در مورد روش های انتقال داده ها. دو نوع GET (از طریق url، باز - می توانید آدرس اینترنتی را به صورت دستی تغییر دهید) و POST (از طریق فرم، بسته) وجود دارد. تفاوت در محتوای نوار آدرس، یعنی آدرس اینترنتی خواهد بود.

هنگام دریافت داده های منتقل شده به یکی از این روش ها، داده ها در آرایه ای از نوع مربوط به روش ($_GET یا $_POST) جمع آوری می شوند. همچنین آرایه‌ای به نام $_REQUEST وجود دارد که می‌تواند همزمان شامل $_GET و $_POST باشد. اما این برای نمونه های دیگر است. من توصیه می کنم بیشتر داده ها را با استفاده از روش POST منتقل کنید.

حالا بیایید به کد کنترلر نگاه کنیم.

کد پی اچ پی(در فایل test_reg.php)

$login = $_POST["ورود"]; // داده های ارسال شده توسط POST را می پذیرد
$pass = $_POST["pass"]; // login و pass نام فیلدهای ورودی هستند

اگر (($login == "Admin") && ($pass == "Pass"))
echo "سلام، مدیر! امروز قهوه است یا چای؟)"؛
else echo "شما یک ترکیب ورود و رمز عبور اشتباه وارد کرده اید. دوباره امتحان کنید بازگشت"؛
?>
می‌توانید ببینید که چگونه مقادیر فیلدها را با نام مربوطه در آرایه $_POST در متغیرهای جداگانه ثبت می‌کنیم، اگرچه می‌توان آن را در $_REQUEST نیز جمع‌آوری کرد.

شاید در کنترلر شرایط مجوز را بررسی کنیم - آیا ورود و رمز عبور در فرم با فرضی ما مطابقت دارد (به ترتیب Admin و Pass). و یا به شخص ورودی سلام می‌کنیم (سلام، مدیر! امروز قهوه است یا چای؟)، یا نه (ترکیب ورود-گذرواژه را اشتباه وارد کرده‌اید. دوباره امتحان کنید). با این حال، برای ایجاد یک مجوز کامل، همچنان باید با کوکی‌ها، جلسات و ... آشنا شوید. اما در ادامه بیشتر در مورد آن.

به طور مستقیم در اسکریپت، می توانید داده ها را همانطور که می خواهید پردازش کنید: پیوست، پاک کردن، رمزگذاری و غیره. نکته اصلی این است که نام متغیر را بدانید (تنظیم شده در فرم HTML) و سپس آنها را با استفاده از آرایه های $_POST، $_GET و $_REQUEST جمع آوری کنید.

با تشکر از توجه شما!

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

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

Multithreading در php امکان پذیر است

بله، با استفاده از pthread ها می توانید چند رشته ای را در PHP انجام دهید

از مستندات PHP:

pthreads یک API شی گرا است که تمام ابزارهای مورد نیاز برای multithreading در PHP را فراهم می کند. برنامه های PHP می توانند ایجاد، خواندن، نوشتن، اجرا و همگام سازی با Threads، Workers و Threaded کنند.

هشدار. پسوند pthreads را نمی توان در محیط وب سرور استفاده کرد. بنابراین، رشته‌ها در PHP باید در برنامه‌های مبتنی بر CLI باقی بمانند.

تست ساده

#!/usr/bin/phparg = $arg; ) تابع عمومی run() ( if ($this->arg) ($sleep = mt_rand(1, 10); printf("%s: %s -start -sleeps %d" . "\n", date(" g:i:sa")، $this->arg، $sleep؛ sleep($sleep)؛ printf("%s: %s -finish". "\n", date("g:i:sa" ), $this->arg) ) ) // ایجاد یک آرایه $stack = array(); //Initiate Thread های متعدد foreach (range("A"، "D") به صورت $i) ($stack = new AsyncOperation($i); ) // شروع Threads foreach ($stack به عنوان $t) ($t- >start(?>).

مسابقه اول

12:00:06 بعد از ظهر: A -شروع -خواب 5 12:00:06 بعد از ظهر: B -شروع -خواب 3 12:00:06 بعد از ظهر: C -شروع -خواب 10 12:00:06 بعد از ظهر: D -شروع -خواب 2 12: 00:08 بعد از ظهر: D - پایان 12:00:09 بعد از ظهر: B - پایان 12:00:11 بعد از ظهر: A - پایان 12:00:16 بعد از ظهر: C - پایان

اجرای دوم

12:01:36 بعد از ظهر: A -شروع -خواب 6 12:01:36 بعد از ظهر: B -شروع -خواب 1 12:01:36 بعد از ظهر: C -شروع -خواب 2 12:01:36 بعد از ظهر: D -شروع -خواب 1 12: 01:37 بعد از ظهر: B - پایان 12:01:37 بعد از ظهر: D - پایان 12:01:38 بعد از ظهر: C - پایان 12:01:42 بعد از ظهر: A - پایان

نمونه دنیای واقعی

گزارش_خطا (E_ALL)؛ class AsyncWebRequest Thread را گسترش می دهد ($url عمومی؛ داده $ عمومی؛ تابع عمومی __construct($url) ($this->url = $url؛ ) تابع عمومی run() (اگر (($url = $this->url)) ( /* * اگر حجم زیادی از داده درخواست می شود، ممکن است بخواهید * fsockopen کنید و با استفاده از usleep در بین خواندن ها بخوانید */ $this->data = file_get_contents($url); ) else printf("Thread #%lu URL ارائه نشد\n", $this->getThreadId()); ) ) $t = microtime(true); $g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() * 10)); /* شروع همگام سازی */ if ($g->start()) ( printf("درخواست %f ثانیه طول کشید تا شروع شود ", microtime(true) - $t); while ($g->isRunning()) ( echo "."; usleep(100); >data))؛ else printf(" و %f ثانیه تا پایان، درخواست انجام نشد\n", microtime(true) - $t);

چرا از popen استفاده نمی کنید؟

برای ($i=0; $i<10; $i++) { // open ten processes for ($j=0; $j<10; $j++) { $pipe[$j] = popen("script2.php", "w"); } // wait for them to finish for ($j=0; $j<10; ++$j) { pclose($pipe[$j]); } }

Threading در PHP موجود نیست، اما برنامه نویسی همزمان با استفاده از درخواست های HTTP در قالب تماس های ناهمزمان امکان پذیر است.

اگر تنظیم curl timeout روی 1 تنظیم شده باشد و از همان session_id برای فرآیندهایی که می‌خواهید به یکدیگر متصل شوند استفاده می‌کند، می‌توانید مانند مثال زیر به متغیرهای session متصل شوید. با این روش حتی می توانید مرورگر خود را ببندید و فرآیند همزمان همچنان روی سرور وجود دارد.

فراموش نکنید که شناسه جلسه صحیح را بررسی کنید، به عنوان مثال:

http://localhost/test/verifysession.php؟ sessionid = [شناسه معتبر]

startprocess.php

$request = "http://localhost/test/process1.php?sessionid=".$_REQUEST["PHPSESSID"]; $ch = curl_init(); curl_setopt($ch، CURLOPT_URL، $request); curl_setopt($ch، CURLOPT_RETURNTRANSFER، true); curl_setopt($ch، CURLOPT_TIMEOUT، 1); curl_exec ($ch); curl_close ($ch); echo $_REQUEST["PHPSESSID"];

process1.php

set_time_limit(0); if ($_REQUEST["sessionid"]) session_id($_REQUEST["sessionid"]); تابع checkclose() (کلی $_SESSION; if ($_SESSION["closesession"]) ( unset($_SESSION["closesession"]); die(); ) ) while(!$close) ( session_start(); $_SESSION ["test"] = rand(); if ($_REQUEST["sessionid"]) session_id($_REQUEST["sessionid"]); تابع checkclose() (کلی $_SESSION; if ($_SESSION["closesession"]) ( unset($_SESSION["closesession"]); die(); ) ) while(!$close) ( session_start(); $_SESSION ["test"] = rand(); if ($_REQUEST["sessionid"]) session_id($_REQUEST["sessionid"]); تابع checkclose() (کلی $_SESSION; if ($_SESSION["closesession"]) ( unset($_SESSION["closesession"]); die(); ) ) while(!$close) ( session_start(); $_SESSION ["test"] = rand();

verifysession.php

if ($_REQUEST["sessionid"]) session_id($_REQUEST["sessionid"]); session_start(); var_dump ($_SESSION);

closeprocess.php

if ($_REQUEST["sessionid"]) session_id($_REQUEST["sessionid"]); session_start(); $_SESSION["closesession"] = درست; var_dump ($_SESSION);

در حالی که نمی‌توانید رشته‌سازی کنید، درجه خاصی از کنترل روی فرآیند در php دارید. در اینجا دو مجموعه مفید وجود دارد:

توابع کنترل فرآیند http://www.php.net/manual/en/ref.pcntl.php

می توانید فرآیند خود را با استفاده از pcntl_fork فورک کنید - PID فرزند را برگردانید. سپس می توانید از posix_kill برای استفاده از این PID استفاده کنید.

با این حال، اگر فرآیند والد را از بین ببرید، باید سیگنالی به پردازش فرزند ارسال شود که به او بگوید بمیرد. اگر خود php این را تشخیص نمی دهد، می توانید تابعی را برای کنترل آن ثبت کنید و با استفاده از pcntl_signal یک خروجی تمیز انجام دهید.

می توانید رشته ها را شبیه سازی کنید. PHP می تواند فرآیندهای پس زمینه را از طریق popen (یا proc_open) راه اندازی کند. این فرآیندها را می توان با استفاده از stdin و stdout ارتباط برقرار کرد. البته این فرآیندها می توانند یک برنامه php باشند. این احتمالاً به همان اندازه نزدیک است که شما دریافت خواهید کرد.

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

من نمی توانم سینتکس php CLI را به خاطر بسپارم، اما شما به چیزی مانند:

Exec("/path/to/php -f "/path/to/file.php" | "/path/to/output.txt"");

فکر می‌کنم چند سرور میزبانی مشترک () exec را به دلایل امنیتی غیرفعال کرده‌اند، اما ممکن است ارزش امتحان کردن را داشته باشد.

بسته به کاری که می خواهید انجام دهید، می توانید از curl_multi نیز برای رسیدن به آن استفاده کنید.

از ارتباطات بین رشته ای دو طرفه پشتیبانی می کند و همچنین دارای محافظ داخلی برای کشتن نخ های کودک (پیشگیری از یتیم) است.

ممکن است این گزینه را داشته باشید:

  1. multi_curl
  2. برای همین می توانید از دستور system استفاده کنید
  3. سناریوی ایده آل ایجاد یک تابع استریم در C و کامپایل/تنظیم در PHP است. این تابع اکنون یک تابع PHP خواهد بود.

pcntl_fork چطور؟

برای مثال، صفحه مرد ما را بررسی کنید: PHP pcntl_fork

در صورت فعال بودن pcntl_fork در محیط وب سرور کار نخواهد کرد حالت امن. در این حالت فقط در نسخه PHP CLI کار خواهد کرد.

کلاس Thread از آنجایی که pthread های PECL ≥ 2.0.0 موجود است.

این مقاله سازماندهی چند درخواست را با استفاده از PHP با استفاده از کتابخانه cURL شرح می دهد. قرار است از این مکانیسم برای ایجاد اسکریپت هایی استفاده شود که درخواست های خودکار را به چندین وب سرور ارسال می کنند.

در عمل خود، مدیران وب‌سایت‌ها اغلب مجبورند از ربات‌های نرم‌افزاری استفاده کنند که درخواست‌های منظم یا انبوه برای صفحات وب، پر کردن فرم‌های ثبت نام، یا انجام سایر اقدامات مشابه را انجام می‌دهند. به طور سنتی و کاملاً موجه برای این منظور از زبان PHP و کتابخانه cURL استفاده می شود که تقریباً بر روی تمام سرورهای وب نصب می شوند. کتابخانه cURL، در اصل، یک پوشش روی سوکت ها است و فقط یک سرویس راحت برای استفاده برای ایجاد یک درخواست http بسته به پارامترهای مشخص شده برنامه نویس است.

در مواردی که نیاز به درخواست از یک وب سرور دارید، ابزارهای معمول cURL کاملاً کافی هستند، اما اگر نیاز به ایجاد تعداد زیادی درخواست وب دارید، استفاده از مکانیسم چند رشته ای می تواند افزایش قابل توجهی در عملکرد و افزایش سرعت ایجاد کند. فیلمنامه

قبل از شروع به توضیح مکانیسم توسعه اسکریپت ها، ابتدا به ما بگویید که منظور من از چند رشته ای چیست. نکته اینجاست که در PHP در واقع هیچ چند رشته ای وجود ندارد و زمانی که عبارت " چند رشته ای» در مورد کتابخانه cURL، ما در مورد آن صحبت می کنیم چند پرس و جو

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

می خواهم فوراً متذکر شوم که ابزارهای کار با multithreading در cURL بسیار کمیاب هستند، اما حتی با مواردی که در دسترس هستند، می توانید کار تمام عیار را با درخواست های چندگانه سازماندهی کنید.

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

1. لیست تمام URI ها را در یک آرایه قرار دهید
2. آرایه‌ای از cURL‌های «معمولی» در تعداد مورد نیاز (تعداد رشته‌ها) و یک cURL_multi ایجاد کنید.
3. هر cURL ایجاد شده را مقداردهی اولیه کنید (URL از آرایه آماده شده قبلی، متغیرهای پست، در صورت نیاز، پراکسی ها و غیره)
4. هر cURL را به cURL_multi اضافه کنید
5. همه رشته ها را با استفاده از تماس cURL_multi راه اندازی کنید
6. در حلقه، وضعیت cURL_multi را نظرسنجی می کنیم و در صورت وجود یک رشته تکمیل شده، صفحه حاصل را پردازش می کنیم و یک cURL جدید به جای آن راه اندازی می کنیم. اگر لیست URI ها به پایان رسیده باشد، ما فقط نتیجه را پردازش می کنیم. این حلقه تا زمانی ادامه می یابد که حداقل یک رشته ناتمام وجود داشته باشد.
7. همه cURL را ببندید.

اکنون، در واقع، اسکریپتی که این عملیات را انجام می دهد:

    تابع تجزیه (&$urls ,$flowcount) (

    // $urls - آرایه با URL ها

    // $flowcount - تعداد رشته ها

    // تاپیک ها را شروع کنید

    $ch = آرایه () ;

    $lcount0 =count($urls);

    if ($flowcount >$lcount0 ) $flowcount =$lcount0 ;

    برای ($flow =0 ;$flow<$flowcount ;$flow ++) $ch =curl_ini(array_pop ($urls ) ) ; //ایجاد آرایه cURL

    $mh =curl_multi_init() ; //ایجاد cURL_multi

    برای ($flow =0 ;$flow<$flowcount ;$flow ++) { //در این حلقه، cURL ها مقداردهی اولیه می شوند

    curl_setopt($ch [$flow ],CURLOPT_REFERER,'TESTREFERER') ;

    curl_setopt($ch [ $flow ],CURLOPT_USERAGENT,” );

    curl_setopt($ch [ $flow ],CURLOPT_RETURNTRANSFER,1) ;

    curl_setopt($ch [ $flow ],CURLOPT_POST,1) ;

    curl_setopt($ch [ $flow ],CURLOPT_POSTFIELDS,'TEST=TESTVAR' );

    curl_setopt($ch [$flow ],CURLOPT_COOKIE,‘TEST=TESTCOOKIE') ;

    curl_multi_add_handle($mh ,$ch [ $flow ] );

    $flows =null ;

    انجام دادن ( //حلقه اصلی تا زمانی ادامه می یابد که حداقل یک رشته کار وجود داشته باشد

    curl_multi_exec($mh ,$flows) را انجام دهید; در حالی که ($flows ==$flowcount) ; //به صورت دوره ای تعداد رشته های در حال اجرا را بررسی کنید

    $info =curl_multi_info_read($mh ) ;

    if (!count ($urls) ) ( // URL دیگری برای پردازش وجود ندارد

    curl_close($info [ 'handle' ] );

    $flowcount –;

    ) دیگر ( //هنوز یک URL برای پردازش وجود دارد

    curl_setopt($info [ 'handle' ] ,CURLOPT_URL,array_pop ($urls ) );

    $res =curl_multi_getcontent($info [ 'handle' ] );

    curl_multi_remove_handle($mh ,$info [ 'handle' ] );

    نظرات کافی در متن کد وجود دارد تا بفهمید چه اتفاقی در حال رخ دادن است. چند نکته را روشن کنم...

    1. فراخوانی curl_multi_init باید بعد از اینکه همه cURLهای "عادی" مقداردهی اولیه شدند، انجام شود. تعویض خطوط 9 و 10 غیرممکن است، بنابراین بخش های کد برای مقداردهی اولیه $ch و تنظیم پارامترهای لازم از هم جدا می شوند.

    2. هر بار که curl_multi_exec در خط 22 فراخوانی می‌شود، متغیر $flows روی تعداد رشته‌های فعال تنظیم می‌شود، که سپس با تعداد رشته‌های در حال اجرا مقایسه می‌شود (متغیر $flowcount اگر ورودی‌های بیشتری وجود نداشته باشد کاهش می‌یابد. لیست URLهایی که باید پردازش شوند (آرایه $urls).

    3. curl_multi_info_read اطلاعات مربوط به رشته پردازش شده بعدی را برمی گرداند، یا اگر هیچ تغییری از زمان فراخوانی قبلی به این تابع وجود نداشته باشد، false است.

    4. تابع curl_multi_info_read داده های قرار داده شده در متغیر $info را تنها پس از اجرای curl_multi_exec به روز می کند، بنابراین باید از هر دو تابع برای پردازش هر رشته استفاده شود.

    5. برای افزودن یک رشته جدید، باید سه تابع را به صورت متوالی فراخوانی کنید: curl_multi_remove_handle، curl_multi_add_handle و curl_multi_exec.

    و نکته آخر: گاهی اوقات دانستن برخی اطلاعات اضافی مربوط به جریان در حال پردازش مهم است. در این حالت، می‌توانید یک آرایه انجمنی ایجاد کنید که کلیدهای آن شناسه‌های رشته، یعنی. مقادیر در $info['handle'].

در برنامه نویسی دائماً باید با منابع مختلفی کار کنید: فایل ها، سوکت ها، اتصالات http. و همه آنها نوعی رابط دسترسی دارند که اغلب با یکدیگر ناسازگار است. بنابراین، به منظور از بین بردن این ناهماهنگی ها و یکپارچه سازی کار با منابع داده های مختلف، ابتدا PHP 4.3اختراع شدند PHP Streams - streams.

با اينكه PHP 4.3خیلی وقت پیش بیرون آمد، خیلی ها برنامه نویسان PHPتصور بسیار مبهمی در مورد موضوعات در PHP، و به استفاده ادامه دهید حلقههمه جا، هر چند در PHPیک جایگزین راحت تر برای این در فرم وجود دارد متن جریان.

انواع زیر در جریان وجود دارد PHP:

  • فایل روی هارد دیسک؛
  • اتصال HTTPبا یک وب سایت؛
  • ترکیب UDPبا سرور؛
  • فایل فشرده;
  • فایل * mp3.

همه این منابع چه مشترکاتی دارند؟ همه آنها را می توان خواند و نوشت، یعنی. عملیات خواندن و نوشتن را می توان برای همه آنها اعمال کرد. زور استریم های PHPترفند این است که شما می توانید با استفاده از مجموعه ای از توابع به همه این منابع دسترسی داشته باشید. خیلی راحت است. همچنین، اگر به طور ناگهانی چنین نیازی پیش آمد، می توانید پیاده سازی خود را از Thread Handler بنویسید. "لفاف بندی جریان". علاوه بر خواندن و نوشتن، استریم ها در PHPهمچنین به شما اجازه می دهد تا عملیات دیگری مانند تغییر نام و حذف را انجام دهید.

برنامه نویسی روشن است PHP، شما قبلاً با موضوعاتی روبرو شده اید، اگرچه ممکن است متوجه آن نشده باشید. بنابراین، توابعی که با جریان ها کار می کنند هستند fopen(), file_get_contents(), فایل()و غیره. بنابراین، در واقع، شما در حال حاضر از جریان های فایل در تمام این مدت، کاملا شفاف استفاده می کنید.

برای کار با نوع دیگری از جریان، باید پروتکل آن را مشخص کنید (لفاف)به روش زیر: wrapper://some_stream_resource، جایی که wrapper://- برای مثال این است http://, فایل://, ftp://, zip://و غیره و some_stream_resource - URI، آنچه را که می خواهید باز کنید را مشخص می کند. URIهیچ محدودیتی در قالب اعمال نمی کند. مثال ها:

  • http://site/php-stream-introduction.html
  • file://C:/Projects/rostov-on-don.jpg
  • ftp://user:password@test.com/pub/file.txt
  • mpeg://file:///music/song.mp3
  • data://text/plain;base64,SSBsb3ZlIFBIUAo=

با این حال، لطفاً توجه داشته باشید که همه پروتکل‌ها و کنترل‌کننده‌ها ممکن است برای شما کار نکنند، زیرا پشتیبانی از برخی پوسته‌ها به تنظیمات شما بستگی دارد. بنابراین، برای اینکه بفهمید کدام پروتکل ها پشتیبانی می شوند، باید اسکریپت زیر را اجرا کنید:

// لیست حمل و نقل سوکت های ثبت شده
print_r(stream_get_transports());

// لیست رشته های ثبت شده (هندلر)
print_r(stream_get_wrappers());

// لیست فیلترهای ثبت شده
print_r(stream_get_filters();

زمینه های موضوع PHP

اغلب هنگام درخواست http نیاز به تعیین پارامترهای اضافی وجود دارد. زمینه‌های موضوع این مشکل را با اجازه دادن به شما برای تعیین پارامترهای اضافی حل می‌کنند. بسیاری از توابع thread-aware یک پارامتر زمینه رشته اختیاری دارند. بیایید به عملکرد نگاه کنیم file_get_contents():

رشته file_get_contents (رشته $filename [، int $flags = 0 [، منبع $context [، int $offset = -1 [، int $maxlen = -1]]]]

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

$options = آرایه(
"http" => آرایه(
"method" => "GET",
"header" => "Accept-language: en\r\n".
"کوکی: foo = bar\r\n"
);

$context = stream_context_create($options);

// استفاده از این با file_get_contents ...
echo file_get_contents("http://www.example.com/"، 0، $context);

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

بازدید: 1256

من اخیراً pthread ها را امتحان کردم و به طرز خوشایندی شگفت زده شدم - این افزونه ای است که توانایی کار با چندین رشته واقعی را در PHP اضافه می کند. بدون تقلید، بدون جادو، بدون تقلبی - همه چیز واقعی است.



من چنین وظیفه ای را در نظر دارم. مجموعه ای از وظایف وجود دارد که باید به سرعت تکمیل شوند. PHP ابزارهای دیگری برای حل این مشکل دارد که در اینجا ذکر نشده است، مقاله در مورد pthread ها است.



thread ها چیست

همین! خوب، تقریباً همه چیز. در واقع، چیزی وجود دارد که ممکن است خواننده کنجکاو را ناراحت کند. هیچ کدام از اینها روی PHP استاندارد کامپایل شده با گزینه های پیش فرض کار نمی کند. برای لذت بردن از Multithreading، باید ZTS (Zend Thread Safety) را در PHP خود فعال کنید.

راه اندازی PHP

بعد، PHP با ZTS. به تفاوت زیاد در زمان اجرا در مقایسه با PHP بدون ZTS اهمیت ندهید (37.65 در مقابل 265.05 ثانیه)، من سعی نکردم تنظیمات PHP را تعمیم دهم. در مورد بدون ZTS، من برای مثال XDebug را فعال کرده ام.


همانطور که می بینید، هنگام استفاده از 2 رشته، سرعت اجرای برنامه تقریبا 1.5 برابر بیشتر از کد خطی است. هنگام استفاده از 4 رشته - 3 بار.


می توانید توجه داشته باشید که با وجود اینکه پردازنده 8 هسته ای است، در صورت استفاده از بیش از 4 رشته، زمان اجرای برنامه تقریباً بدون تغییر باقی می ماند. به نظر می رسد این به این دلیل است که پردازنده من 4 هسته فیزیکی دارد، برای وضوح، صفحه را به صورت نمودار به تصویر کشیده ام.


خلاصه

در PHP می توان با استفاده از پسوند pthreads با multithreading بسیار زیبا کار کرد. این باعث افزایش قابل توجه بهره وری می شود.

دیدگاه ها