【问题标题】:Weird PHP Parse/Syntax errors with VMWare 6.5 + PHP 5.3.3 + Symfony 1.4VMWare 6.5 + PHP 5.3.3 + Symfony 1.4 出现奇怪的 PHP 解析/语法错误
【发布时间】:2011-09-17 01:34:17
【问题描述】:

在学习“Practical Symfony”课程时,我遇到了一个奇怪的错误。

我在 VMWare 6.5.5 机器上安装了 Debian Squeeze。它带有 PHP 5.3.3,我使用的是 Symfony 1.4。源文件在主机上,我使用共享文件夹功能(vmhgfs mount)访问它们。

现在,当我尝试以下命令时,出现错误:

php symfony doctrine:build --model    
php symfony doctrine:build --sql

错误:

PHP Parse error:  syntax error, unexpected ')' in /var/www/appli/lib/model/doctrine/base/BaseJobeetJob.class.php on line 144

有趣的是,当我: - 在没有共享文件夹的情况下做同样的事情(例如在 ext3 分区上),它可以工作, - 将VM转换为VirtualBox并在共享文件夹上执行相同的操作,它可以工作, - 将 PHP 降级到 5.2.6(从 lenny),它可以工作。

我记得前段时间 Smarty 生成的 PHP 代码也遇到过同样的问题。由于它是自动生成的 PHP 并且可以随意重新生成,因此我在本地目录中生成了它。但我认为这不适用于 Doctrine 生成的文件。

有没有人知道发生了什么以及我该如何解决?

编辑:这是第 144 行的代码:

    public function setUp()
    {
        parent::setUp();
        $this->hasOne('JobeetCategory', array(
             'local' => 'category_id',
             'foreign' => 'id',
             'onDelete' => 'CASCADE'));

        $timestampable0 = new Doctrine_Template_Timestampable();
        $this->actAs($timestampable0);
    }
} // Line 144 here.

其实就是文件的结尾……

编辑#2:为了清楚起见,我已经测试了以下组合以缩小问题范围:

  • VM 软件:VMWare 工作站 6.5.5/VirtualBox 4.0.8
  • PHP 版本:5.3.3 / 5.2.6,
  • 安装类型:vmhgfs(或带有 VirtualBox 的 vboxsf)/ext4(本地) /cifs(又名 Windows 共享)。

在每种情况下,我都使用相同的源文件(但对于 ext4,因为我别无选择,只能复制它们)。组合粗体项目时失败。如果我改变其中任何一个,一切都会好起来的。我还尝试使用 open-vm-modules 代替提供的 vmware 工具,并从头开始构建 Debian 安装,而不是使用我自己的自动化脚本,但都没有改变任何东西。

【问题讨论】:

  • 您能否在第 144 行显示 BaseJobeetJob.class.php 周围的代码?也许学说:任务没有正常工作。
  • 实际上,“php5 -l /var/www/appli/lib/model/doctrine/base/BaseJobeetJob.class.php”告诉我“未检测到语法错误”。此外,如果我尝试使用 PHP 5.2.6(从使用 5.3.3 创建的模型)从另一个虚拟机构建 SQL,一切都很好。
  • 哼。我猜你这里有一个真正的WTF。我为你感到难过。
  • 您的主机操作系统是什么?是 Windows 吗?
  • 在旁注中,我终于切换到没有这个问题的 VirtualBox。但是,Apache 有时无法正确发送已修改的文件。我发现我可以通过禁用共享文件夹中文件的文件内存映射(EnableMMAP Off)和内核发送文件支持(EnableSendFile Off)来修复它。

标签: php symfony1 doctrine vmware-workstation


【解决方案1】:

关于 Wordpress 和 Laravel,我也遇到了这个问题。要解决此问题,我必须从来宾重新挂载已安装的文件夹。

例如,我所有的源文件都位于主机 (OSX) 上,并通过 vmhgfs 共享给 Ubuntu (guest)。挂载点是 /mnt/hgfs/www。重新挂载:

sudo mount /mnt/hgfs/www

【讨论】:

    【解决方案2】:

    这似乎是 vmhgfs 中的一个错误 - 我在使用 Drupal PHP 代码时遇到了同样的问题。它似乎也只发生在将文件添加到主机时来宾,例如使用 git 克隆 Linux VM 中的存储库。

    有三种解决方法:

    1. 将文件复制到所需位置,然后在虚拟机的 VMWare 设置中禁用共享文件夹,刷新网页以显示“未找到”,然后重新启用共享文件夹。

    2. 在主机上,运行以下命令更新每个文件的文件访问/修改时间戳,从而导致 VMWare 驱动程序重新加载文件,修复问题:

      find . -exec touch {} \;
      
    3. 从主机打开受影响的文件,对其进行修改,然后将其保存回来。如果您使用的是 Windows 计算机,这可能会很有用。

    错误范围从 PHP Parse 错误到其他错误,通常标记文件的最后一行。

    【讨论】:

    • @binaryLV,同意。但是我不知道如何强制刷新缓存,除了卸载/重新安装,这很不方便。
    【解决方案3】:

    我在 OpenSUSE 11.4 和 PHP 5.3.5 上使用 vmhgfs(在 Mac 上)遇到了同样的问题。我在使用学说,但是我在没有完整的 symfony 项目的情况下使用它。

    最初 vmhgfs 根本不起作用,所以我下载了 open-vm-tools 并编译/安装了它。这解决了我几个星期的问题,但今天又回来了。

    问题似乎是 php 读取文件末尾之后。如果我使用 cat、less 或 tail 读取文件,则文件末尾看起来很好。

    但是,如果我执行php -s bad_file.php > bad_file.php.html 并查看 html 输出,我可以在文件末尾看到一些额外的垃圾,而这些垃圾在 cat、less 或 vim 中是看不到的。

    你可以看到php在文件末尾看到“array(”,而其他工具看不到。

    我找到的唯一解决方案是在每个有问题的文件末尾手动添加一个新的空白行。由于某种原因,它只影响大约 40 个文件中的 1-2 个。

    【讨论】:

    • 令人着迷,很好的调试工作。我希望我能弄清楚应该在哪里提交错误 - VMWare 或 PHP。
    【解决方案4】:

    啊!最后我想通了。我在 Mac OS X Lion (10.7.2) 上使用 VMware Fusion (4.0.2),我一直在努力解决这个问题。

    升级您的 VMware Tools!

    到目前为止,一切都很好:没有再次遇到问题。目前的最新版本是 VMware Tools 8.0.0。

    【讨论】:

    • 对我不起作用。刚刚安装了 vmware tools 8.4.7,重新启动(两次),仍然得到同样的错误。精...
    • 对我也不起作用,刚安装 VMware 4.1.4 和 Tools 8.8.5 仍然出现同样的错误
    【解决方案5】:

    同样的问题。我确认这是一个 vmhgfs 问题。 一种解决方法是使用 NFS 共享而不是 vmware 共享文件夹:

    Linux 环境

    apt-get install portmap nfs-common nfs-kernel-server
    
    mkdir /nfs-share1
    echo "/nfs-share1 192.168.2.1(rw,sync)" >> /etc/exports
    
    /etc/init.d/portmap start
    /etc/init.d/nfs-kernel-server start
    /etc/init.d/nfs-common start
    
    usermod -u 501 paolo
    find / -user paolo -exec chown paolo {} \;
    

    OS X 环境

    showmount -e 192.168.2.129
    
    mkdir /Users/paolo/netshare1
    mount -t nfs -o resvport,soft,intr,rsize=8192,wsize=8192,timeo=900,retrans=3,proto=tcp 192.168.2.129:/nfs-share1 /Users/paolo/netshare1/
    

    【讨论】:

      【解决方案6】:

      好吧,这可能是题外话,但我希望它有所帮助:
      我正在写同一本书,我已经这样做了(我认为你最好像我一样做):

      • 在 VirtualBox 中安装了 Ubuntu Server
      • 在 Ubuntu 上安装 LAMP 服务器
      • 已安装 vsftpd,用于在 Ubuntu 上进行 ftp 访问
      • 在 Ubuntu 上安装了 SSH 服务器。

      现在,如果我在 Linux 主机上,我使用具有 ftp 访问权限的 Aptana Studio 来编辑文件和 SSH 来运行命令,如果我在 Windows 上,我使用 Aptana Studio 和 Putty 来进行 SSH 访问。

      如果你做类似的事情,你可能不会遇到麻烦。 希望对您有所帮助。

      【讨论】:

      • 感谢您的回答,但不幸的是,我必须在服务器上使用 Debian Squeeze,因为我们将在生产中使用它。此外,我必须将源文件保存在主机文件系统中。
      猜你喜欢
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2017-12-06
      相关资源
      最近更新 更多