在生产中的几个请求之后出现Symfony HTTP 500错误

时间:2017-01-02 10:42:00

标签: php symfony

我正在使用Symfony v3.0.9。一切都在本地工作正常,但当我将应用程序移动到生产,一段时间后,我开始收到错误,如:

request.CRITICAL: Uncaught PHP Exception Symfony\Component\Config\Exception\FileLoaderLoadException: "Unable to find file "@FrontendBundle/Resources/config/routing.yml" in @FrontendBundle/Resources/config/routing.yml

request.CRITICAL: Uncaught PHP Exception InvalidArgumentException: "Unable to find template "FrontendBundle::homepage/homepage.html.twig" (looked into: [...]/vendor/symfony/symfony/src/Symfony/Bridge/Twig/Resources/views/Form)." at [...]/symfony/symfony/src/Symfony/Bridge/Twig/TwigEngine.php line 128 

PHP Fatal error:  Cannot access  property appProdProjectContainer::$parameters in [...]/var/cache/prod/appProdProjectContainer.php on line 30

(这两个文件都存在,Web服务器可以很好地访问它们)

有时候应用程序在清除缓存后工作正常和/或composer install有时它不会,并且在它最终再次运行后需要多次尝试。源代码没有变化。

我认为这可能与应用处理的同时请求有关,这可能会导致缓存文件出现异常。

有什么想法吗?

更新#1 - 虚拟主机配置:

<VirtualHost *:80 *:443>
    ServerName example.net
    ServerAlias www.example.net example.com www.example.com example.org www.example.org
    DocumentRoot /home/example/www/example.net/web/
    ErrorLog  /home/example/www/example.net/logs/error.log
    CustomLog /home/example/www/example.net/logs/access.log combined

    RewriteEngine on

    RewriteCond %{HTTP_HOST} example\.(org|com)$ [NC]
    RewriteRule ^(.*)$ https://www.example.net$1 [R=301,L]

    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R]

    RewriteCond %{HTTP_HOST} !^www\.
    RewriteRule ^(.*)$ https://www.%{HTTP_HOST}$1 [R=301,L]

    AssignUserId example www-data

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/www.example.net/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.example.net/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/www.example.net/chain.pem
</VirtualHost>

更新#2 - memory_limit更新:

我将PHP中的memory_limit从256MB更新为-1(无限制),到目前为止我还没有遇到500错误,除了一次。这是由PHP Fatal error: Cannot access property appProdProjectContainer::$parameters引起的,它在第一个rm -rf var/cache/prod

之后得到修复

3 个答案:

答案 0 :(得分:1)

同样在 vhosts.conf httpd.conf 中,验证您是否有权访问您的网站目录:

<Directory "/home/example/www/example.net/web/">
    DirectoryIndex app.php
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

答案 1 :(得分:0)

前段时间我在Mac OS上有类似的东西。 Apache或PHP因为你已经显示的消息而开始崩溃

在Mac上,打开文件数量有限制存在问题。您可以在https://superuser.com/questions/433746/is-there-a-fix-for-the-too-many-open-files-in-system-error-on-os-x-10-7-1获取一些信息。

我最终运行以下命令来修复它

  public void showList(){
       try {
           JSONObject jsonObj = new JSONObject(sJSON); //String sJSON
           jsonArray = jsonObj.getJSONArray(TAG_RESULTS); //JSONArray jsonArray = null;

           for (int i = 0; i < jsonArray.length(); i++) {

               c = jsonArray.getJSONObject(i); //JSONObject c;
               //String id = c.getString(TAG_ID);
               name = c.getString(TAG_NAME);
               address = c.getString(TAG_ADD);


               String phone = c.getString(TAG_PHONE);
               String dlatitude = c.getString(TAG_LAT);
               String dlongitude = c.getString(TAG_LONG);


               lat = Double.parseDouble(dlatitude);
               longi = Double.parseDouble(dlongitude);

               Location curlocation = new Location("curpoint");
               curlocation.setLatitude(latitude);
               curlocation.setLongitude(longitude);

               Location datalocation = new Location("datapoint");
               datalocation.setLatitude(lat);
               datalocation.setLongitude(longi);

               distance = curlocation.distanceTo(datalocation);
               meter = Double.toString(distance);

               HashMap<String, String> location = new HashMap<String,String();

               //location.put(TAG_ID,id);
               location.put(TAG_NAME, name);
               location.put(TAG_ADD, address);
               location.put(TAG_PHONE, phone);
               location.put(TAG_LAT, dlatitude);
               location.put(TAG_LONG, dlongitude);

               location.put(TAG_DIS, "DISTANCE" + meter + "m");

               slocationList.add(location);

               ListAdapter adapter = new SimpleAdapter(CurrentLocationActivity.this, slocationList, R.layout.list_item,new String[]{TAG_NAME, TAG_ADD, TAG_PHONE, TAG_LAT,TAG_LONG,TAG_DIS},new int[]{R.id.name, R.id.address, R.id.phone,R.id.latitude,R.id.longitude, R.id.distance});

               list.setAdapter(adapter);
        }
    }
}

答案 2 :(得分:0)

不久前我不得不面对类似的问题 - 有时候找不到某些文件(主要是模板和/或路由文件),但它们都在服务器上。我发现这是因为我是通过Filezilla使用我自己的用户名/密码将它们上传到服务器(所以我的服务器上的用户是这些文件的所有者),但是symfony应用程序是在另一个用户下运行的,这个用户可以如果他不是他们的主人,不要使用文件。

我不确定你是否面临与我相同的问题,但我希望它会对你有帮助。