Как передать сессию в новый сокет через fsockopen? - PullRequest
0 голосов
/ 04 сентября 2011

Мне нужно передать сеанс асинхронному вызову через fsockopen в php.

Вы можете помочь мне передать сеанс в новый сокет?

РЕШЕНИЕ:

Работает следующий код.

start.php

<?php
session_start();
$_SESSION['var1'] = 'value1';
async_call('/async.php');
echo '<pre>';
print_r($_SESSION);
echo $_COOKIE['PHPSESSID'] . "\r\n";
echo '<a href="verify.php">verify.php</a>';

function async_call($filepath) {
    $host = 'sandbox'; // set to your domain
    $sock = fsockopen($host, 80);
    fwrite($sock, "GET $filepath HTTP/1.1\r\n");
    fwrite($sock, "Host: $host\r\n");
    fwrite($sock, "Cookie: PHPSESSID=" . $_COOKIE['PHPSESSID'] . "\r\n");
    fwrite($sock, "Connection: close\r\n");
    fwrite($sock, "\r\n");
    fflush($sock);
    fclose($sock);
}
?>

async.php

<?php
session_start();
logger('confirm logger is working');
logger($_SESSION);  // this is always blank!

function logger($msg) {
    $filename = 'debug.log';
    $fd = fopen($filename, "a");
    if (is_array($msg))
        $msg = json_encode($msg);
    $msg = '[' . date('Y/m/d h:i:s', time()) . "]\t" . $msg;
    fwrite($fd, $msg . "\n");
    fclose($fd);
}
?>

verify.php

<?php
$logfile = 'debug.log';
echo '<a href="start.php">start.php</a>';
echo '<pre>' . file_get_contents($logfile);
?>

Я мог заставить это работать локально, но оказалось, что общий хост, на котором я работал, запрещен fsockopen без какой-либо документации.Все хорошо на моих собственных серверах.Спасибо за помощь.

1 Ответ

1 голос
/ 07 сентября 2011

Спасибо за помощь, Андреас. Оказывается, общий хост, на котором я размещал запрещенный fsockopen без какой-либо документации. Вот почему я мог заставить его работать локально, но не на промежуточном сервере.

Следующий код работает.

start.php

<?php
session_start();
$_SESSION['var1'] = 'value1';
async_call('/async.php');
echo '<pre>';
print_r($_SESSION);
echo $_COOKIE['PHPSESSID'] . "\r\n";
echo '<a href="verify.php">verify.php</a>';

function async_call($filepath) {
    $host = 'sandbox'; // set to your domain
    $sock = fsockopen($host, 80);
    fwrite($sock, "GET $filepath HTTP/1.1\r\n");
    fwrite($sock, "Host: $host\r\n");
    fwrite($sock, "Cookie: PHPSESSID=" . $_COOKIE['PHPSESSID'] . "\r\n");
    fwrite($sock, "Connection: close\r\n");
    fwrite($sock, "\r\n");
    fflush($sock);
    fclose($sock);
}
?>

async.php

<?php
session_start();
logger('confirm logger is working');
logger($_SESSION);  // this is always blank!

function logger($msg) {
    $filename = 'debug.log';
    $fd = fopen($filename, "a");
    if (is_array($msg))
        $msg = json_encode($msg);
    $msg = '[' . date('Y/m/d h:i:s', time()) . "]\t" . $msg;
    fwrite($fd, $msg . "\n");
    fclose($fd);
}
?>

verify.php

<?php
$logfile = 'debug.log';
echo '<a href="start.php">start.php</a>';
echo '<pre>' . file_get_contents($logfile);
?>
...