کوزههای کوکی PHP cURL برای نشستهای کاربری جداگانه
طراحی ماندگاری کوکی PHP cURL پیرامون نشست راه دور: نام فایلهای مورد اعتماد، ذخیره صریح و درخواستهای همزمان.
یک برنامه PHP به Alice و Bob سرویس میدهد و هر دو از کلاینت cURL سمت سرور آن برای رسیدن به یک وبسایت راه دور از طریق یک پروکسی استفاده میکنند. اگر هر درخواست cookies.txt را بارگذاری کند، دو کاربر میتوانند همان ورود راه دور را به ارث ببرند. تغییر نشانیهای پروکسی آنها آن فایل را جدا نمیکند.
پیش از انتخاب نام فایل، صاحب کوکی را انتخاب کنید. معمولاً همان نشست منطقی راه دور برنامه است: یک کاربر محلی، یک حساب راه دور مشخص و در صورت نیاز یک فضای کاری جداگانه. نقطه پایانی پروکسی یک انتخاب مسیریابی است، نه شناسه نشست قابل اعتماد. چند کاربر میتوانند یک نقطه پایانی را شریک شوند و یک نقطه پایانی میتواند خروجیها را بچرخاند.
کوزه همان نشست را بارگذاری و ذخیره کنید
اجازه دهید برنامه نشست تأییدشده خود را به کلید فایلی که سرور تولید میکند نگاشت کند. با یک پوشه کوکی خصوصی و $sessionKey مورد اعتماد، پیکربندی cURL این شکل را دارد:
$jar = $cookieDirectory . '/' . $sessionKey . '.cookies';
$ch = curl_init('https://service.example.net/account');
curl_setopt_array($ch, [
CURLOPT_PROXY => 'http://proxy.example.net:8080',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEFILE => $jar,
CURLOPT_COOKIEJAR => $jar,
]);
برای یک آزمون مجاز نشست در یک سایت عمومی روی شبکهای که واسطه عمومی را میپذیرد، فهرست پروکسی HTTP نقاط پایانی نامزد را فراهم میکند. از یک دستگیره بدون احراز هویت پروکسی پیکربندیشده یا اعتبارنامه پروکسی نگهداشتهشده استفاده کنید و وضعیت کوکی را به نشست مورد نظرش اختصاصدهید. این قطعه یک دستگیره را پیکربندی میکند؛ برنامه انتقال را انجام میدهد و نتیجه را از طریق جریان عادی درخواست بررسی میکند. COOKIEFILE کوکیهای قبلی نشست را بارگذاری میکند. COOKIEJAR انتخاب میکند که دستگیره کوکیهای نگهداشتهشدهاش را کجا بنویسد. تنظیم تنها فایل خروجی، ورود قبلی را بارگذاری نمیکند.
یک نشست جدید میتواند بدون فایل شروع شود. به اولین انتقالش مسیر کوزه مورد نظر را بدهید، بگذارید وبسایت کوکیها را ایجاد کند و وضعیت حاصل را برای درخواست بعدی ذخیره کنید. پوشه کوکی باید توسط کارگر برنامه قابل نوشتن باشد و بیرون از درخت اسنادی که علنی سرو میشود نگه داشته شود. نام کاربری یا مسیری که بازدیدکننده میدهد را به نام فایل تبدیل نکنید؛ کلید مورد اعتماد را روی سرور جستجو کنید.
ذخیرهسازی به جایی در چرخه عمر درخواست نیاز دارد
libcurl معمولاً کوزه را در هنگام پاکسازی دستگیره مینویسد. اگر برنامه پس از تبادل راه دور به یک نقطه ذخیره صریح نیاز داشته باشد، میتواند درخواست کند:
curl_setopt($ch, CURLOPT_COOKIELIST, 'FLUSH');
این کوکیهایی را که دستگیره اکنون میشناسد در کوزه پیکربندیشدهاش مینویسد. استفاده از دستگیره برای آن نشست را تمام کنید، سپس آن را به کاری نامرتبط اختصاص دهید. تغییر تنها نام مسیر کوزه روی دستگیرهای که از پیش کوکیهای Alice را نگه میدارد با ایجاد نشست پاک Bob برابر نیست.
همچنین یک بارگیری موفق را از یک ماندگاری موفق تشخیص دهید. مستندات کوزه کوکی میگوید شکست نوشتن در هنگام پاکسازی بهعنوان خطای انتقال عادی بازگردانده نمیشود. وقتی ورود برای یک درخواست کار میکند و در درخواست بعدی ناپدید میشود، مالکیت پوشه، مجوزها و خروجی تشخیصی برنامه را بررسی کنید.
درخواستهای همزمان مرز دیگری وارد میکنند. دو کارگر میتوانند همان کوزه کهنه را بارگذاری کنند، وضعیت خود را مستقل در حافظه تغییر دهند و سپس نتایج متفاوتی را ذخیره کنند. اگر هر دو درخواست یک ورود راه دور را شریک شوند، قفل بهازای هر نشست یا سریالسازی معادل باید کل توالی بارگذاری، تبادل و ذخیره را بپوشاند؛ قفل کردن فقط نوشتن نهایی، عکسهای فوری پیشین آنها را سازگار نمیکند. نشستهای متفاوت باید فایلهای متفاوت و قفلهای مستقل داشته باشند.
هنگام خروج، نشست راه دور مورد نظر را پایان دهید و وضعیت کوکی محلی آن را بر اساس سیاست برنامه بازنشسته کنید. سپس یک پروکسی تازه انتخابشده میتواند به هر نشست جدیدی که کاربر آغاز میکند متصل شود، بدون آنکه نشانی پروکسی مسئول تعیین این باشد که ورود چه کسی در حافظه است.