【问题标题】:PHP unexpected end of file happens in online testing environment, but doesn't happen in development environment在线测试环境中发生PHP意外文件结束,但在开发环境中没有发生
【发布时间】:2017-03-31 13:46:01
【问题描述】:

在我将最后一次代码更新拉到运行测试环境的 AWS 实例后,页面显示 HTTP 错误 500。我正在使用 CodeIgniter,AWS 实例被设置为“生产”运行(SetEnv CI_ENV production on .htaccess),所以我将其更改为“开发”以显示 PHP 错误消息。那是我收到以下消息的时候。

遇到未捕获的异常

类型:ParseError

消息:语法错误,文件意外结束

文件名:/var/www/html/flip/application/views/flip_list.php

行号:58

回溯:

文件:/var/www/html/flip/application/controllers/Flip.php 线路:131 功能:查看

文件:/var/www/html/flip/index.php 线路:315 函数:require_once

在我的本地主机环境中不会发生这种情况,页面显示时没有错误或警告。

Localhost 正在运行 PHP 7.0.15-0ubuntu0.16.04.4。 AWS 实例在 CentOS 上运行 PHP 7.0.14。 CodeIgniter 版本为 3.1.3。

我检查了flip_list.php和Flip.php,但没有找到问题所在。

控制器文件 (Flip.php) 有 350 多行,因此我将其发布在 pastebin 上:https://pastebin.com/agyMuf1T

下面是视图的代码(flip_list.php):

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
?>
<?php
$first = true;
$second = false;
foreach ($editions->result() as $edition) {
    $edition_hash = $this->flip->encrypt_decrypt_edition_id($edition->edition_id, 'encrypt');

    $date = date_create($edition->edition_date);
    $date = date_format($date, 'd\/m\/Y');

    if( $first ) {
        $first = false;
        $second = true;
    ?>
    <div class="latest">
        <div class="item">
            <a href="<?php echo base_url('flip/'.$slug.'/view/'.$edition_hash); ?>" class="view-edition">
                <img src="<?php echo $edition->edition_cover; ?>" class="edition-cover">
                <span>Edição <?php echo $date; ?></span>
                <span>Número <?php echo $edition->edition_number; ?></span>
            </a>
        </div>
    </div>
    <?php
    }
    else {
    if( $second ) { 
        $second = false;
    ?>
    <div class="editions">
    <div class="d-flex flex-row align-content-stretch flex-wrap">
    <?
    }
    ?>
        <div class="item">
            <a href="<?php echo base_url('flip/'.$slug.'/view/'.$edition_hash); ?>" class="view-edition">
                <img src="<?php echo $edition->edition_cover; ?>" class="edition-cover">
                <span><?php echo $date; ?></span>
            </a>
        </div>
    <?php
    }
} // foreach
?>
    </div><!-- .d-flex -->
    </div><!-- .editions -->

我需要一些帮助来调试这个。谢谢!

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    您的测试服务器上可能禁用了短标签 (http://php.net/manual/en/language.basic-syntax.phptags.php)。您有两个选择,在 php.ini 中启用短标签或将 &lt;? 更改为 &lt;?php。使用短标签通常不被认为是一种很好的做法,像这样的错误是原因之一,所以我建议您将标签更改为使用&lt;?php

    我将发布包含您的短标签的部分视图:

     <div class="editions">
        <div class="d-flex flex-row align-content-stretch flex-wrap">
        <?
        }
        ?>
            <div class="item">
    

    【讨论】:

    • short_open_tag 在两种环境中都被禁用。我没有发现
    • 您发布的视图中有一个:&lt;div class="d-flex flex-row align-content-stretch flex-wrap"&gt; &lt;? } ?&gt; &lt;div class="item"&gt;
    • 确实是有问题的开始标签。我更新了代码以使用
    【解决方案2】:

    服务器中的文件意外结束可能会发生,因为通常实时服务器在 linux 上。而且您可能正在 Windows 服务器上进行测试,因此在传输文件时可能会对其进行修改,因为 Windows 和 linux 具有不同的机制来表示新行。因此,设置如下(在 Filezilla FTP 客户端中): 转到Transfer &gt; Transfer type &gt; select Binary 并再次上传您的所有视图文件。

    【讨论】:

    • 我尽可能避免在 Windows 上运行 Apache。特别是在这个项目中,我是在 localhost 上的 LAMP 堆栈上编码的唯一开发人员,AWS 实例也运行 Linux,并且代码通过 git 存储库传输。我不知道这个错误可能是由于 Windows 上的不同行尾而发生的。谢谢,萨罗杰!
    【解决方案3】:

    我发现 PHP 7.3+ 支持 HEREDOC 和 NOWDOC 语法。我是 PHP 开发新手,我绝对更喜欢 HEREDOC 语法,而不是混合的打开/关闭标签。

    后来意识到我有 7.4 版在本地运行,7.0 版在远程运行。我的代码中有几个 HEREDOC 分配在我的本地机器上运行没有问题,但我在/var/log/nginx/error.log 中发现了一个“意外的文件结尾”错误,在控制台中显示为 500 Internal Server Error。

    对此感到非常困惑几个小时,直到我没有想法并删除了 HEREDOC。然后它起作用了。希望这对其他人有帮助。经验教训:在开发和生产环境中保持 PHP 版本相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 2020-11-23
      • 2018-06-04
      • 1970-01-01
      相关资源
      最近更新 更多