0

由于我们将项目从 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');
}
4

0 回答 0