由于我们将项目从 PHP 5 切换到 7.4,发生了一些奇怪的事情,虽然我怀疑这是 PHP 的事情,但请先听我说完。
HTML/PHP 项目使用 Zend 框架的 Zend_ProgressBar_Adapter_JsPush 类。
屏幕上有一个 HTML 按钮。单击后,PHP 脚本将在后台运行并调用该类的update
方法Zend_ProgressBar
。在 PHP 脚本执行/完成的每一步之后,该值都会增加 +20,直到达到 100。
还有一个 HTML 表格。第 2 列显示每个步骤的结果之前的加载图标。该表中有 5 行,因此每个步骤为一行。
现在的情况是:在 PHP5 时代,当 PHP 脚本运行时,用户可以看到到目前为止 PHP 脚本已经到达/完成了哪一步,但是现在使用 PHP7.4,一旦 PHP 运行,所有字段都会更新脚本完成。它们显示正确,但问题是它不再逐步刷新。
就像一切都在后台排队或其他东西一样,JavaScript 没有机会“实时”更新任何字段,所以它在 PHP 脚本的末尾进行。
我不知道是什么原因。我什至尝试sleep(5)
在这些步骤之间添加,我发现它正在工作。但是,如果有更好的解决方案,为什么还要让用户等待 5 次 5 秒呢?
这是 PHP 代码的(精简版):
$adapter = new Zend_ProgressBar_Adapter_JsPush();
$adapter->setUpdateMethodName('Zend_ProgressBar_Update');
$adapter->setFinishMethodName('Zend_ProgressBar_Finish');
$progress = new Zend_ProgressBar($adapter, 0, 100);
$result = "";
$progress->update(0, $result);
// Do something...
$progress->update(20, $result);
// [...]
$progress->update(100, $result);
JavaScript 方法:
function Zend_ProgressBar_Update(data)
{
switch (data.current) {
case 0:
/* Reset progress table */
/* [...] */
break;
case 20:
/* Fill first row column of table with data.text */
/* [...] */
break;
/* [...] */
case 100:
/* Fill final row column of table with data.text */
/* [...] */
break;
default:
//alert('default');
break;
}
function Zend_ProgressBar_Finish()
{
alert('Finished');
}