我需要一个每两秒刷新一次的随机字符串,这样你就会得到每两秒钟混合一个单词的效果。这是我的代码:
function rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ rand( 0, $size - 1 ) ];
}
return $str;
然后我想重复一遍,而不是无限制,所以我使用了这段代码:
$random = rand_string( 9 );
for($i=0; $i < 5; $i++) {
echo $random;
flush();
sleep(2);
}
不知何故,页面等待10秒然后显示我的字符串,我的字符串显示相同的五倍,而不是每两秒刷新一次。你能帮我吗?
答案 0 :(得分:1)
尝试类似下面的示例。替换指向您自己的服务器上的页面/服务的URL,该URL返回下一个字符串值(没有其他内容)。请务必将响应中的内容类型(从服务器)设置为“text / plain”。
如其他帖子中所述/指示/暗示,问题是HTTP是无状态协议。浏览器发送请求。服务器发送响应。结束。 :-) PHP代码专门在服务器上执行,其作业仅为Web浏览器生成内容。但它不会以任何方式与浏览器交互。一旦PHP代码生成的所有内容都发送到浏览器,PHP代码就完成了。您应该阅读一些关于输出缓冲等概念的内容。您可以对PHP代码是否缓冲所有输出然后将其一次性发送到浏览器,或者在生成它时将其涓涓细流进行一点控制。但是你根本无法使用PHP代码以交互方式更改网页上的任何内容。一旦你将它发送到浏览器,它就会被发送,就是这样。你不能回电并改变它。
现在,说到这一点,你肯定可以使用PHP代码发出JavaScript代码,然后可以在浏览器中与DOM交互,并且还可以将AJAX调用回服务器上的不同资源,它可以反过来是不同的PHP页面,它们做任何你需要它们并返回结果显示或在浏览器中进一步处理(这可能导致对服务器的额外AJAX调用,虽然“聊天”通常不等于“好” “)。
AJAX (异步JavaScript和XML)是一种技术,可让您从网页上调用返回到Web服务器,而无需重新加载整个页面。您可以使用setInterval()和setTimeout()等JavaScript计时器函数来实现延迟或创建重复事件,例如文本更新。不要太依赖“AJAX”中的“XML”。一种名为JSON的更新的数据封装标准已经变得非常流行,并且至少可以通过AJAX使用,因为几乎在所有情况下都使用XML。 JSON 是“JavaScript Object Notation”,标准基本上只是序列化的JavaScript数据结构,非常自然可以使用。
事实上,在下面显示的示例中,既没有使用XML也没有使用JSON(为了简单起见)。但是XML或JSON很容易被使用,并且可能应该是一个严肃的服务实现。
XMLHttpRequest 对象是使AJAX成为可能的神奇位。 XMLHttpRequest,setInterval(),setTimeout()和大量其他API使用异步回调。这是你需要接受的另一个概念。异步回调只是一个传递给它的函数,例如setInterval(),这样当定时器事件发生时它就能“回调你”(你传递对函数的引用)。与此同时,您的界面没有被锁定等待回调。因此它是异步的。我下面的示例还使用了名为闭包的内联(未命名,匿名)函数,这是另一个对现代JavaScript编程非常重要的概念。
最后,我衷心建议使用像jQuery这样的东西。好吧,我推荐jQuery。还有其他JavaScript框架,但我不完全确定再看其他任何一个有很多意义。下面的示例不使用jQuery。
由于PHP仅在服务器上执行,因此您使用原始示例完成的主要任务是使页面花费更长时间才能完全完成呈现,这意味着您的请求与Web服务器断开连接所需的时间更长反过来又占用服务器上的连接资源,在请求完成后至少10秒完成后,其他任何浏览器实例都无法使用该连接资源。
<html>
<head>
</head>
<body>
<div id="blah">Watch me change.</div>
<script language="javascript">
// set callback function, to be called every 2 seconds
setInterval( function() {
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
else { // IE6, IE5
xmlhttp = new ActiveXObject( "Microsoft.XMLHTTP" );
}
// callback function called for each state change, "4" means request finished.
xmlhttp.onReadyStateChange = function() {
if( 4 == xmlhttp.readyState && 200 == xmlHttp.status ) {
document.getElementById("blah").innerHTML = xmlHttp.responseText;
}
}
xmlhttp.open( "GET", "http://source-of-new-string...", true );
xmlhttp.send();
}, 2000 );
</script>
</body>
</html>
答案 1 :(得分:0)
您还不了解Web开发的基础知识。您编写的单个PHP脚本首先生成一个字符串,然后循环5次,输出生成的字符串然后休眠2秒,当脚本完成后,它将刷新到浏览器。因此很明显,因为你只调用了一次函数,所以你会在10秒后看到5个相同的字符串。
对于无状态的“HTTP请求”,每2秒钟出现一个新字符串是不可能的。您需要使用Ajax-callbacks来实现该效果,每2秒从客户端调用一次。
答案 2 :(得分:0)
header('Content-Type: text/html; charset=UTF-8');
function rand_string( $length ) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$size = strlen( $chars );
for( $i = 0; $i < $length; $i++ ) {
$str .= $chars[ rand( 0, $size - 1 ) ];
}
return $str;
}
for($i=0; $i < 5; $i++) {
$random = rand_string(9);
echo $random;
flush();
ob_flush();
sleep(2);
}
您需要在循环中定义变量$ random new。
答案 3 :(得分:0)
首先,PHP无法按照您的意愿行事。 PHP将网页内容发送到浏览器,浏览器又显示它。
因此,浏览器可能会选择在开始显示页面之前需要接收的数据量。
有延迟:五次sleep(2);
。浏览器在显示数据之前等待连接结束。
其次,下面的代码只打印变量$random
的内容的五倍,这在for循环中永远不会改变。所以内容相同的五倍。
$random = rand_string( 9 );
for($i=0; $i < 5; $i++) {
echo $random;
flush();
sleep(2);
}
有你的重复:五次echo $random;
。
$random
是一个变量。对于rand()
函数,see here。I need a random string
that refreshes every two seconds
。刷新部分可以通过javascript获得,或者最坏的情况是,每两秒刷新一次页面,并显示一个新的字符串和旧的字符串。这将留下添加新字符串的错觉(中间加载丑陋的页面时间)。