Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阻止PHP sleep()影响我的整个PHP代码?_Php_Sleep_Delay - Fatal编程技术网

如何阻止PHP sleep()影响我的整个PHP代码?

如何阻止PHP sleep()影响我的整个PHP代码?,php,sleep,delay,Php,Sleep,Delay,所以,在我的街机上,howlingdoggames.com。我有一个积分系统,每次你访问一个有游戏的页面时,它都会给你一分。为了减少这种滥用,我想做一些延迟,所以它只在45秒后授予。以下是我尝试过的: if($\u会话['lastgame']!=$gameid){ 睡眠(45); $points=$points+$game_积分; $\会话['lastgame']=$gameid; } 但这似乎让我的整个网站停顿了45秒,因为这是在index.php中,还有我网站的许多其他代码 不管怎样,我是

所以,在我的街机上,howlingdoggames.com。我有一个积分系统,每次你访问一个有游戏的页面时,它都会给你一分。为了减少这种滥用,我想做一些延迟,所以它只在45秒后授予。以下是我尝试过的:

if($\u会话['lastgame']!=$gameid){
睡眠(45);
$points=$points+$game_积分;
$\会话['lastgame']=$gameid;
}
但这似乎让我的整个网站停顿了45秒,因为这是在
index.php
中,还有我网站的许多其他代码

不管怎样,我是否可以分离出这段代码,这样它就只生成语句了

$points = $points + $game_points;

等待45秒?不,不是直接等待。您需要采取另一种方法,比如记住上次访问的时间戳,并且只有在经过足够的时间后才添加点。

与其阻止脚本,不如在会话中保存当前时间,不要添加点,让页面呈现。然后,在以后的页面视图中,如果您看到会话中节省的时间超过45秒,请添加点,将它们存储在需要的任何位置,然后清除时间。

PHP中没有多线程,因此
sleep()
总是会阻塞整个脚本

解决这一问题的方法是记录最后一场比赛的时间,并且只有在比这晚45秒以上的情况下才奖励分数

<?php
session_start();
if (!isset($_SESSION['last_game_time'])
    || (time() - $_SESSION['last_game_time']) > 45) {

    // code to award points here

    $_SESSION['last_game_time'] = time();
}
PHP中(大部分)没有多线程。您可以在Unix系统上通过分叉进程来实现这一点,但这并不重要,因为多线程并不是您真正想要的。您只需要这样的简单逻辑:

$now=time();
会话_start();
$last=$\会话['lastvisit'];
如果(!isset($last)|$now-$last>45){
$points=$\u会话['points']??0;
$\会话['points']=$点+10;
$\会话['LastVisite']=$now;
}

基本上只在上次评分之间的增量大于45秒的情况下评分。

您不能,但您可以将此代码设置为javascript代码,并使用AJAX保存奖金。

这是会话阻止脚本。不是“PHP中没有多线程”。 session\u write\u close()在睡眠之前()将解决整个脚本的阻塞问题。但可能不适合你的问题

因此您必须使用js和AJAX的settimeout来保存奖金。

来自php.net中sleep()的注释:


请注意,sleep()延迟当前会话的执行,而不仅仅是脚本。考虑下面的示例,其中两台计算机从浏览器调用相同的脚本,该脚本除了睡眠之外什么也不做。p> 奇怪的是,在这个问题上随机投了反对票。只是好奇是否有原因,或者这是一次失败的战术降级尝试?不是我,但代码示例实际上并没有回答这个问题,因为这应该只在你访问一个新游戏+你在
$\u会话['last']
中有一个输入错误后发生。怎么会这样?无论如何,您都要在服务器上验证AJAX调用。有人知道该评论是否属实吗?它被否决了