Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5在AJAX密集型应用程序中丢失会话和.env配置值_Php_Ajax_Session_Laravel - Fatal编程技术网

Php Laravel 5在AJAX密集型应用程序中丢失会话和.env配置值

Php Laravel 5在AJAX密集型应用程序中丢失会话和.env配置值,php,ajax,session,laravel,Php,Ajax,Session,Laravel,我使用的是Laravel 5(具体来说,“Laravel/framework”版本为“v5.0.27”),会话驱动程序为“file” 我在Windows7 64位机器上开发 我注意到有时(大约一周一次)我会意外地随机注销。有时这种情况甚至在我登录后立即发生。我已将日志消息添加到身份验证逻辑代码中,但未触发日志代码。Laravel的行为就像完全丢失了会话文件一样 另一个更严重的问题是,有时在调试会话(使用xdebug和Netbeans)之后,Laravel开始丢失其他文件-.env设置、一些deb

我使用的是Laravel 5(具体来说,“Laravel/framework”版本为“v5.0.27”),会话驱动程序为“file”

我在Windows7 64位机器上开发

我注意到有时(大约一周一次)我会意外地随机注销。有时这种情况甚至在我登录后立即发生。我已将日志消息添加到身份验证逻辑代码中,但未触发日志代码。Laravel的行为就像完全丢失了会话文件一样

另一个更严重的问题是,有时在调试会话(使用xdebug和Netbeans)之后,Laravel开始丢失其他文件-.env设置、一些debugbar JS文件等。错误日志中有如下消息:

[2015-07-08 13:05:31] local.ERROR: exception 'ErrorException' with message 'mcrypt_encrypt(): Key of size 7 not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported' in D:\myproject\vendor\laravel\framework\src\Illuminate\Encryption\Encrypter.php:81
[2015-07-08 13:05:31] local.ERROR: exception 'PDOException' with message 'SQLSTATE[HY000] [1044] Access denied for user ''@'localhost' to database 'forge'' in D:\myproject\vendor\laravel\framework\src\Illuminate\Database\Connectors\Connector.php:47
这清楚地表明Laravel没有读取.env文件,因此它使用默认设置:

'database'  => env('DB_DATABASE', 'forge'),
'key' => env('APP_KEY', 'somekey'),
丢失文件很少发生,可能一个月左右一次,而且总是在调试会话之后发生。我总是必须重新启动Apache才能使它再次工作

为了对系统进行压力测试并可靠地再现问题,我在Angular controller中使用了快速破解:

setInterval(function(){
    $scope.getGridPagedDataAsync();
}, 500);
这只是从Angular到Laravel的一个基本数据请求

就这样-现在我可以在3分钟或更短的时间内重现会话丢失和.env丢失

早些时候,我在同一台PC上使用相同的Apache+PHP开发了AJAX密集型web应用程序,但是没有Laravel,没有.env,我以前也没有注意到这样的问题

在通过代码进行调试时,我发现Laravel根本没有使用PHP内置会话,而是实现了自己的基于文件的会话。显然,它不能提供与默认PHP会话相同的可靠性,我不知道为什么

当然,在现实生活中,我的应用程序不会像AJAX那样密集,但根据我的经验,在某些情况下,只要同时发出两个AJAX请求就足以丢失会话

我在Laravel上看到了一些关于各种会话问题的相关bug报告。虽然我还没有看到关于dot env的任何内容,但它似乎也遇到了同样的问题

我的猜测是,Laravel不使用文件锁定和等待,因此,如果某个文件由于某种原因无法读取(可能被某个并行进程或Apache锁定),那么Laravel就会放弃并返回它所能返回的任何内容

有什么好的解决方法吗?也许它是针对Windows的,而问题会在Linux机器上消失?

奇怪的是,为什么Laravel(或Symfony)开发人员还没有修复他们的会话文件驱动程序。我知道锁定/等待会减慢速度,但最好至少有一些选项来打开“可靠会话”

同时,我将尝试逐步浏览Laravel代码,看看是否可以发明一些“快速且肮脏”的解决方案,但最好有一些可靠的“最佳实践”解决方案

更新关于.env 该问题与锁定文件无关。我找到了.env问题的Laravel bug报告,这使我找到了Dotenv项目的链接报告,该报告反过来说这是一个核心PHP问题。让我不安的是,Dotenv开发人员说Dotenv从来就不打算用于生产,但Laravel似乎依赖Dotenv

事实上,似乎有一个解决方案应该朝着一个方向发展,但一些评论人士表示,在他们的案例中,问题恰恰相反。一个叫crynobone的人给出了一个聪明的代码片段来尝试:

$value = array_get($_ENV, $key, getenv($key));
另一个建议是在Dotenv和Laravel Githubs上使用“makeMutable()”,但评论人士报告说,这可能会破坏测试

因此,我尝试了crynobone的代码,但它对我不起作用。在调试时,我发现在我的情况下,当并发请求出现故障时,在getenv()中、在$\u ENV中甚至在$\u服务器中都找不到$key。 唯一有效的方法(快速脏体验)是添加:

静态::$cached[$name]=$value

到Dotenv类,然后在helpers.php env()方法中,我看到:

Dotenv::$cached[$key]
总是好的,即使$u ENV和getenv都不提供任何东西

虽然Dotenv不适用于生产,但我不想更改我们的部署和配置工作流

接下来,我将不得不调查会话问题


补遗 相关的Laravel bug报告(有些甚至来自版本4,似乎还没有修复):

还有一篇老文章,它揭示了正在发生的事情(至少在会议问题上):

我个人认为使用.env配置Laravel是一个错误的决定。拥有包含key:value配置风格的.php文件要好得多

然而,您遇到的问题不是PHP的错,也不是Apache的错——很可能是Windows的问题

还有一些事情:Apache包含一个模块,允许将PHP二进制文件集成到Apache的进程或线程中,称为
mod_PHP
——问题是PHP不仅速度慢,而且将另一个二进制文件集成到现有的进程或线程中非常棘手,可能会遗漏一些东西。在这种情况下,PHP还必须具有线程安全性。如果不是,那么奇怪的bug可能(也将)发生

为了避免将一个程序复杂地集成到另一个程序中的问题,我们可以完全避免这种情况,我们可以通过FastCGI协议提供
.php
。这意味着web服务器(Apache或Nginx)将接收HTTP请求并将其传递给另一个“web”服务器。在我们的例子中,这将是PHP FastCGI Process Manager或
PHP-FPM

PHP-FPM
是服务
.PHP
页面的首选方式-不仅因为它速度更快(比通过
mod_PHP
集成要快得多),而且您可以轻松地扩展HTTP前端,让多台机器服务
.PHP
页面,允许您轻松地水平扩展HTTP前端

然而,
PHP-FPM
'metadata_update_threshold' => 1,