PHP应用程序在使用Git部署时会崩溃,如果通过sftp部署则可以正常工作


PHP app breaks when deployed with Git, works fine if deployed via sftp

我有一个简单的PHP应用程序,我在MAMP本地开发。我确实使用了一些Composer包。它在我的本地机器上运行得很好。当我使用Beanstalk应用程序(不是AWS Beanstalk,我指的是Git托管和部署服务Beanstalk)部署网站时,一旦在代码中引用第一个类名,它就会抛出一个错误。

Fatal error: Class 'User' not found in /srv/www/example.com/public_html/utilities/authenticate.php on line 8

这个类特定于ActiveRecord模型类,用于访问数据库。在代码中,它看起来像这样:

$user_row = User::find_by_email($theuser);

非常简单,在我的本地开发环境中工作。ActiveRecord由Composer自动加载。

然后我尝试通过sftp部署应用程序到我的Centos VPS,令我惊讶的是,错误消失了,应用程序按预期工作。我的猜测是Beanstalk在部署过程中以某种方式破坏了应用程序。因此,为了测试该理论,我在服务器上设置了一个裸Git仓库,并使用post-receive钩子将仓库检出到公共Apache文件夹中。这导致了我在Beanstalk中遇到的同样的错误。这个问题似乎与git部署有关。我检查了文件是否具有标准的644权限,文件夹是否设置为755。Apache拥有公共文件夹,所以所有权也不是问题。我真的不知道为什么会发生这种事。在这件事上,任何智慧都是非常受欢迎的。

尝试检查您的.gitignore文件。如果将内容粘贴到这里就更好了。您确定部署后不需要在服务器上运行composer install吗?

我已经设法解决了这个问题。这是我对ActiveRecord的错误配置。我的"User"模型类驻留在一个名为"User .php"的文件中。当使用ActiveRecord时,这是一个不正确的命名约定。由于类名以大写字母开头,所以文件名也必须以大写字母开头。通过将文件重命名为"User.php",ActiveRecord能够正确地定位类。奇怪的是,当通过sftp将文档放在服务器上时,错误的命名不是问题。我必须假设CentOS文件系统有我不完全理解的复杂性。我知道,不像CentOS, OS X没有区分大小写的文件系统,这就是为什么这个错误从未在开发中发生的原因。