2

我试图延迟 PHP 执行,直到通过 JavaScript 设置 cookie。代码如下,createCookie为了简单起见,我修剪了 JavaScript 函数(我已经测试了函数本身并且它可以工作)。

<?php
if(!isset($_COOKIE["test"])) {
    ?>
    <script type="text/javascript">
        $(function() {
            // createCookie script
            createCookie("test", 1, 3600);
        });
    </script>
    <?php
    // Reload the page to ensure cookie was set
    if(!isset($_COOKIE["test"])) {
        header("Location: http://localhost/");
    }
}
?>

起初我不知道为什么这不起作用,但是在使用之后microtime()我发现 PHP 在jQuery 就绪函数之前<script>执行。我显着减少了我的代码以显示一个可以回答的简单版本,我很清楚我能够在 PHP 中使用,对 cookie 的要求是客户端。setcookie()

我知道混合 PHP 和 JavaScript 是不正确的,但是对于如何使这项工作有任何帮助(是否有 PHP 延迟?-我试过sleep()了,没有工作并且认为它不会工作,因为脚本也会被延迟) 将不胜感激。

4

6 回答 6

2

正如其他答案所述,做您想做的事情并非不可能,但是对于您的服务器而言,等待客户端“设置cookie”的每个请求也不是微不足道且严重的坏主意。

但这是可以完成的。

  1. PHP 代码将编写一个<script>用于设置 cookie 的块。
  2. PHP 代码将开始一个空闲循环,监视会话变量。不是饼干。执行 PHP 脚本的 cookie 已经设置好,不会被 JavaScript 更改。
  3. #1 中编写的 JavaScript 块还需要对服务器进行 AJAX 调用。它调用的 PHP 脚本应该设置你关心的 cookie,但也设置会话变量#2 关心。
  4. 监视会话的原始脚本应该唤醒并按您的计划继续。

虽然 PHP确实在 JavaScript 之前执行,但所有浏览器都会增量加载由 PHP(或任何服务器端语言)生成的 HTML/CSS/JavaScript 内容。由于增量加载,您的 PHP 脚本可能会延迟 JavaScript 执行某些操作(如上所述),然后再继续。但是您的服务器将有很多令人头疼的事情要处理,例如如果 JavaScript 请求从未通过,那么要等待多长时间才能让 JavaScript 打破 #2 中的空闲循环等。

这不是标准网页的正常执行流程。除非您真的需要这个,否则也许可以将其视为概念验证答案。

于 2012-10-02T03:55:38.197 回答
1

如果要在 PHP 之前执行 JavaScript,则必须将其分成两个请求。您可以在一个请求中加载 JavaScript,并在设置 cookie 后执行 Ajax 请求。请记住,在执行客户端代码之前会处理所有服务器端代码。

我不得不问..你为什么要这样做?你想达到什么目的?

于 2012-10-02T03:38:12.407 回答
1

Cookies 可以在 PHP 中设置setcookie

setcookie("test",1,time()+3600);
于 2012-10-02T03:45:15.680 回答
1

PHP 首先在服务器上完整执行。然后它将最终的 HTML/Javascript/CSS 输出发送到浏览器。浏览器接收到这个并执行任何 Javascript。

用该代码做你想做的事情基本上是不可能的。PHP 和 Javascript 在完全不同的环境中运行在完全不同的时间。一旦 Javascript 设置 cookie 以启动另一个PHP 脚本,您需要启动另一个对服务器的请求。使用 Javascript 重定向或查看 AJAX。

于 2012-10-02T03:37:30.863 回答
0

PHP 在服务器端执行,JS 在客户端执行。在来自浏览器的单个 GET 请求中,PHP 将始终在 JS 之前执行。

于 2012-10-02T03:37:49.737 回答
0

这不能在单个请求中完成。PHP 首先运行,然后是 JavaScript。即使是增量加载也无济于事,因为 cookie 是通过标头发送的,并且在 PHP 运行时已经发送。

但是,您可以让 JavaScript 设置 cookie,然后在完成后使用location.reload(). 然后 PHP 只需要打印 JavaScript,如下所示:

<?php
if(!isset($_COOKIE["test"])) {
    ?>
    <script type="text/javascript">
        $(function() {
            // createCookie script
            createCookie("test", 1, 3600);
            // reload the page, which would send the cookie at the next request
            location.reload();
        });
    </script>
    <?php
    // stop execution and wait for JavaScript to call you again.
    exit;
}
?>
于 2012-10-02T03:43:36.277 回答