延迟PHP执行直到JavaScript cookie设置?

时间:2012-10-02 03:33:33

标签: php javascript

我试图延迟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()之后我发现<script>之后的PHP正在之前执行 jQuery就绪函数。我大大减少了我的代码,以显示一个可以回答的简单版本,我很清楚我可以在PHP中使用setcookie(),对cookie的要求是客户端。

我理解混合PHP和JavaScript是不正确的,但是如何使这项工作有任何帮助(是否有PHP延迟? - 我试过sleep(),没有工作,没有想到它会起作用,因为脚本也会被延迟),我们将非常感激。

6 个答案:

答案 0 :(得分:2)

不可能 执行您正在尝试的操作,正如其他答案所述,但对您的服务器来说,这也不是一件轻而易举的事情。等待客户端的每个请求“设置一个cookie。”

但是可以做到。

  1. PHP代码会写一个<script>块来设置cookie。
  2. PHP代码将开始一个空闲循环,监控会话变量。不是cookie。 PHP脚本执行的cookie已经设置好,不会被JavaScript改变。
  3. 用#1编写的JavaScript块也需要对服​​务器进行AJAX调用。它调用的PHP脚本应该设置你关心的cookie,还要设置会话变量#2关心。
  4. 监听会话的原始脚本应该按照您的计划醒来并继续。
  5. 虽然PHP 在JavaScript之前执行,但所有浏览器都会逐步加载由PHP(或任何服务器端语言)生成的HTML / CSS / JavaScript内容。由于增量加载,您的PHP脚本可能会在继续之前延迟JavaScript执行某些操作(如上所述)。但是你的服务器将会遇到很多麻烦,例如,如果JavaScript请求永远不会出现,等待JavaScript在#2中打破空闲循环的时间等等。

    这不是标准网页的正常执行流程。除非你真的需要这个,否则可以认为这是一个概念验证的答案。

答案 1 :(得分:1)

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

根本不可能来执行您尝试使用该代码执行的操作。 PHP和Javascript在完全不同的环境中运行完全不同的时间。一旦Javascript设置cookie以启动另一个 PHP脚本,您需要向服务器发起另一个请求。使用Javascript重定向或查看AJAX。

答案 2 :(得分:1)

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

我不得不问..你为什么要这样做?你想要完成什么?

答案 3 :(得分:1)

可以使用setcookie

在PHP中设置Cookie
setcookie("test",1,time()+3600);

答案 4 :(得分:0)

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

答案 5 :(得分: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;
}
?>