【问题标题】:Is it possible to read cookie/session value while executing PHP5 script through command prompt?通过命令提示符执行 PHP5 脚本时是否可以读取 cookie/会话值?
【发布时间】:2011-11-26 13:47:22
【问题描述】:

当我使用命令提示符执行我的 php 脚本时,我需要从 cookie 或会话中读取一些值。我怎样才能做到这一点?

如何从 Windows 命令提示符访问 cookie 或会话值?

【问题讨论】:

  • Cookie 在 CLI 环境中没有意义?

标签: php command-line command nant


【解决方案1】:

Cookie 是从用户的网络浏览器发送的。当您从命令行执行 php 脚本时,没有浏览器可以发送或接收 cookie。无法访问或保存 cookie,除了您在命令行中传递的参数外,不会向脚本发送任何内容。

话虽如此,如果您知道他们的 PHPSESSID cookie,则有一种方法可以读取使用浏览器的人已经访问过的会话。

假设有人使用 Web 浏览器访问了您的脚本,并且他们的 PHPSESSID 是 a1b2c3d4,并且您希望通过他们的会话执行该脚本。在命令行执行以下命令。

php -r '$_COOKIE["PHPSESSID"] = "a1b2c3d4"; session_start(); require("path_to_php_script.php");'

其中 path_to_php_script.php 是您要执行的 php 脚本的路径。实际上,如果您要执行的 php 文件启动会话本身,则您不必启动会话。所以,你可能想实际尝试一下这个命令:

php -r '$_COOKIE["PHPSESSID"] = "a1b2c3d4"; require("path_to_php_script.php");'

好的,现在假设您不想访问某人的会话,但您只想像已经有会话一样执行脚本。只需执行前面的命令,但输入任何你想要的 sessionid。只要您每次调用脚本时使用相同的 PHPSESSID,您的会话将在调用脚本之间保持不变。

【讨论】:

  • 您的方法在本地服务器(xampp)上运行,但是当我在我的网络服务器上尝试它时(godaddy 上的 VPS 计划),它不起作用。似乎我们无法在命令行脚本中读取会话。它托管在centOS 上。你能给出一些解决方案吗?
  • 您应该能够在命令行上读取会话信息。但是,根据您的环境,有很多事情可能会导致问题。可能是命令行上的环境不同...如果您的 Web 环境使用带有某些选项的 php-fpm,则可能会发生这种情况。需要考虑的一些事情......系统用户是否相同?你的 web 环境是 chroot 的吗?命令行与 Web 上的会话选项是否相同?我建议在 web 和命令行中都做一个 phpinfo() 并比较....也许这会提供一些见解。
【解决方案2】:

CLI 中没有 cookie,所以...是的。

您可以将所需的会话名称作为参数或环境变量传递,然后使用session_name() 在您的脚本中进行设置。

【讨论】:

    【解决方案3】:

    你应该试试这个:

    exec('php -r \'$_COOKIE["'.session_name().'"]="'.$_COOKIE[session_name()].'";include("file_path.php");\'');
    

    然后在您的脚本上执行以下操作:

    session_start();
    @session_decode(@file_get_contents(session_save_path().'/sess_'.$_COOKIE[session_name()]));
    

    现在您已经准备好使用会话了!

    请记住,函数 session_save_path() 将获得“默认”路径,在 .ini 文件中设置。

    您始终可以使用自定义路径来加载会话。

    【讨论】:

    • session_start() 的意义何在?我本来希望 PHP 在 session_start() 中自动执行此操作?
    • @gogowitsch Cookies 通过 HTTP.... 他想从控制台运行(在这种情况下,直接运行可执行文件无需 HTTP)。
    • 我的直觉是上面第二个代码块的第 1 行和第 2 行正在做完全相同的事情,除了 session_start 还会注册一个函数,以便在脚本执行时将$_SESSION 内容写回磁盘完成。实际上,他只需要设置会话 ID,然后调用 session_start()。至少在 Xampp (Windows) 下,我可以顺利地工作。但是,我在 Linux 下的所有尝试都失败了。我没有花足够的时间知道为什么。要记住的另一件事是,当会话被 CLI 锁定时,具有该会话的浏览器用户可能正在等待。
    • @gogowitsch 我正在做的是手动设置PHP用来提取会话ID的变量的值,这样你的会话就可以正常启动了。
    猜你喜欢
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2020-07-02
    • 2021-07-07
    相关资源
    最近更新 更多