2009-12-07 33 views
14

Tôi truy cập dịch vụ REST api sử dụng biến được gọi là session_id. API gọi cho việc này để được lưu trữ trong cookie và tôi thực hiện điều này như sau:PHP bằng CURL: có cách nào để mô phỏng cookie thay vì lưu nó vào một tệp không?

$ch = curl_init(); // initialize curl handle 

     curl_setopt($ch, CURLOPT_URL, $url); //set target URL 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);// allow redirects 
     curl_setopt($ch, CURLOPT_COOKIEFILE, './Cookie.txt'); 
     curl_setopt($ch, CURLOPT_COOKIEJAR, './Cookie.txt'); 
     curl_setopt($ch, CURLOPT_POST, TRUE); // set POST method 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); //set headers 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
     curl_setopt($ch, CURLOPT_HEADER, TRUE); //return the headers so we can get session id 
     curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //prevent unverified SSL certificate error 
     curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); //prevent unverified SSL "" 

     $contents = curl_exec($ch); 
     curl_close($ch); 

Vấn đề này được gọi là nhiều lần khác nhau bởi nhiều người dùng khác nhau. (rất nhiều tập tin cookie khác nhau phải được lưu lại) Tôi muốn một cách để lưu trữ session_id trong một biến thay vì tham chiếu đến tệp cookie. Cho đến nay tất cả các nỗ lực của tôi đều bị từ chối bởi dịch vụ. Bất cứ ai cũng có thể đề xuất phương pháp lưu trữ thông tin cookie và id phiên mà không lưu nó vào một tệp? Lưu ý rằng việc đọc id phiên không có vấn đề gì, nó được trả về trong XML. Đối với một số lý do vượt qua nó trở lại mà không tham chiếu các tập tin thực tế tạo ra không vượt qua các thông tin bảo mật. Bất kỳ thông tin nào khác về lý do tại sao điều này cũng có thể hữu ích.

Trả lời

22

Cookie là tiêu đề văn bản đơn giản được gửi cùng với yêu cầu. CURL cho phép bạn chỉ định những người đó trực tiếp bằng cách sử dụng CURLOPT_COOKIE.

curl_setopt($ch, CURLOPT_COOKIE, 'key=value;anotherkey=anothervalue'); 

Nếu bạn biết thông tin nào để gửi, bạn có thể tạo tiêu đề cookie của riêng mình theo cách này. Các tùy chọn COOKIEJAR/COOKIEFILE chỉ tự động phân tích cú pháp, lưu và gửi. Bạn sẽ phải làm điều đó một cách thủ công (đọc tiêu đề Cookie đã nhận, tạo tiêu đề Cookie để gửi), nếu bạn không muốn ghi vào một tệp.

+0

Trang web này thực sự mô tả nó quá http://docstore.mik.ua/orelly/webprog/pcook/ch11_04.htm – Praesagus

4

Tôi sử dụng tempnam để tạo tên tệp duy nhất.

$ckfile = tempnam ("/tmp", "cookieMyWeb"); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 

Tạo tên tệp mới trước khi sử dụng curl.

8

Có một ví dụ điển hình ở đây,

http://sgjoomla.googlecode.com/svn/trunk/joomla/curltest.php

Đối với một số lý do, phần cookie được nhận xét ra nhưng tất cả các mã bạn cần là vẫn còn đó.

Về cơ bản, bạn phân tích "Set-Cookie" tiêu đề cho mình và lưu các giá trị cookie bằng cách làm này,

curl_setopt ($ch, CURLOPT_HEADERFUNCTION, 'read_header'); 

Đặt giá trị cookie trong một toàn cầu. Trong cuộc gọi tiếp theo, hãy đặt nó như thế này,

Các vấn đề liên quan