可以通过系统命令运行的脚本访问正在运行的脚本的SESSION数据吗?

时间:2012-02-22 02:22:57

标签: php apache

当某个登录用户运行scriptA.php时,反过来会使用system()或exec()调用另一个scriptB.php。

scriptB.php是否有可能首先获取运行scriptA.php的用户的SESSION数据的参数? 谢谢!

3 个答案:

答案 0 :(得分:2)

不,你不能用传统方式(使用$_SESSION)来做。最好的方法是将数据作为参数传递给CLI命令,或将其写入STDIN(并在scriptB.php中读取)。

如果您有权限,您还可以去阅读会话文件(如果您正在处理文件中的会话)......但这并不可取。

答案 1 :(得分:1)

如果您的问题与安全问题有关:

我倾向于拒绝。第二个脚本无法访问第一个脚本中的任何变量。

BUT。如果服务器(非常)错误配置,脚本B可以尝试从PHP使用的临时会话目录(php.ini中的session.save_path)访问序列化会话数据。

如果你想在脚本A和脚本B之间传递数据,你可以用其他方法来做,比如FIFO,stdin等。虽然我不明白为什么你想用另一个脚本执行一个脚本EXEC()。

答案 2 :(得分:1)

如果您使用的是基于标准文件的会话,那么您可以让父脚本将会话的ID作为命令行参数传递给子脚本,例如

shell_exec('php scriptB.php ' . session_id());

然后在scriptB中检索该ID:

session_id($argc[1]); // argc contains command line args.
session_start();

我从未尝试在命令行脚本中启动会话,因此您可能必须处理cookie错误等。但即使您不能使用session_start(),您也可以直接访问会话文件并对其进行反序列化,这将是以下内容:

$sess_path = session_save_path() . '/sess_' . $argc[1];
$serialized = file_get_contents($sess_file);
$_SESSION = unserialize($serialized);

对于其他会话系统,例如数据库,您将访问数据库而不是弄乱文件。