- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 vagrant 虚拟机进行本地 PHP 开发,我注意到使用 vagrant-winnfsd 插件时存在 session 写入问题。该插件很好地满足了我的需求,这就是为什么我不想重新配置 vagrant,而是解决读/写问题。我不知道问题的根源,但是和描述的一模一样here 。对我来说,SessionHandler::read()
还需要大约 120 秒才能完成每个请求。
因此,正如作者建议的那样,重新配置 session 处理程序以使用 RDBM 或 Memcache 存储是有意义的。这听起来很合理,但我不想在每个项目中都这样做,我只想在 php.ini 中配置一次,因为它有 session.save_handler
参数并且可以设置为数据库或内存缓存。
我不介意有一个 PHP 类包含所有 ::read()
、::write()
和其他方法,主要是将这段代码放在一个地方。
这可能吗?
更新:我找到了原因,并且非常感谢@Jasper N. Brouwer,他们将其存储在 NFS 同步文件夹中。原因是我没有将 prod
环境添加到 AppKernel.php“vagrant”修复中。所以它曾经是:
public function getCacheDir()
{
if (in_array($this->environment, array('dev', 'test', ''))) {
return '/run/shm/appname/cache/' . $this->environment;
}
return parent::getCacheDir();
}
public function getLogDir()
{
if (in_array($this->environment, array('dev', 'test'))) {
return '/run/shm/appname/logs';
}
return parent::getLogDir();
}
并且在 dev
env 中没问题,但在 prod
中却不行。应该是:
public function getCacheDir()
{
if (in_array($this->environment, array('dev', 'test', 'prod'))) {
return '/run/shm/appname/cache/' . $this->environment;
}
return parent::getCacheDir();
}
public function getLogDir()
{
if (in_array($this->environment, array('dev', 'test', 'prod'))) {
return '/run/shm/appname/logs';
}
return parent::getLogDir();
}
但是,只是出于好奇和为了更容易调试,因为我们现在有了这个赏金,我仍然发现整个 PHP 服务器的公共(public) session 保存处理程序是一个好主意。如果我必须将其保存到数据库中,然后可以使用 GUI 工具在数据库中实时查看所有项目的 session 数据,这在开发中可能很有用。也许,可以使用 auto_prepend_file
设置来做到这一点?并在那里定义保存处理程序,但我不确定如何禁止稍后在任何项目代码中覆盖它。
最佳答案
一个更简单的解决方案是继续使用files
session 保存处理程序,但让它使用一个不是 Vagrant“同步文件夹”的目录。
换句话说,将session.save_path
设置为/tmp
。这可以是任何目录,只要它不是同步文件夹(例如 /vagrant
)。您确实可以在 php.ini
中执行此操作。
最好使用实际上是共享内存目录的目录 (/dev/shm
),它是内存存储(而不是磁盘上)。在大多数 Linux 发行版上,/tmp
实际上是 /dev/shm
内的一个文件夹。
PS:我遇到了类似的问题, session 写入会产生空文件。我也无法找到这个问题的根源(除了它与使用 NFS 的 Vagrant 同步文件夹有关),所以过了一段时间我放弃了搜索,只是做了我上面描述的事情。
由于 Vagrant NFS 挂载速度相对较慢,因此我建议在同步文件夹之外执行其他大量写入操作。
写入密集型事物的示例是缓存系统:
另一个例子是记录器。日志通常会写入文件,这种情况经常发生。
不幸的是,没有真正的方法可以在服务器范围内配置这些目录,因为这完全取决于使用什么组件,需要配置什么,这是非常特定于项目的。
您可以尝试某种 hack,让 Symfony 2 使用环境变量来使用缓存和日志目录。
像这样设置环境变量:
export VENDORNAME_PHP_CACHE_ROOT_DIR='/dev/shm/vendorname/cache'
export VENDORNAME_PHP_LOGS_ROOT_DIR='/dev/shm/vendorname/logs'
这将确保 CLI 工具可以获取这些变量。您可能想在 .bashrc
或类似的内容中执行此操作。
您可能必须在网络服务器的配置中复制此内容:
对于 Apache
SetEnv VENDORNAME_PHP_CACHE_ROOT_DIR /dev/shm/vendorname/cache
SetEnv VENDORNAME_PHP_LOGS_ROOT_DIR /dev/shm/vendorname/logs
对于 Nginx
fastcgi_param VENDORNAME_PHP_CACHE_ROOT_DIR /dev/shm/vendorname/cache;
fastcgi_param VENDORNAME_PHP_LOGS_ROOT_DIR /dev/shm/vendorname/logs;
然后您可以编辑 AppKernel.php
的 getCacheDir()
和 getLogDir()
方法,如下所示:
public function getCacheDir()
{
if ($dir = $this->getDir('VENDORNAME_PHP_CACHE_ROOT_DIR')) {
return $dir;
}
return parent::getCacheDir();
}
public function getLogDir()
{
if ($dir = $this->getDir('VENDORNAME_PHP_LOGS_ROOT_DIR')) {
return $dir;
}
return parent::getLogDir();
}
private function getDir($variable)
{
if (!in_array($this->environment, array('dev', 'test'))) {
return;
}
if (!($rootDir = getenv($variable))) {
return;
}
return sprintf('%s/appname/%s', $rootDir, $this->environment);
}
现在您可以通过这些环境变量控制所有 Symfony 2 项目的缓存和日志目录。
对于其他项目,您可以执行类似的操作。
但是您必须对项目本身进行一些调整。因为这不是 native PHP 功能(例如 session.save_path
),因此无法通过 PHP 配置(仅 php.ini
)来控制它)。
关于php - 所有项目通用的 session.save_handler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709526/
我正在使用 vagrant 虚拟机进行本地 PHP 开发,我注意到使用 vagrant-winnfsd 插件时存在 session 写入问题。该插件很好地满足了我的需求,这就是为什么我不想重新配置 v
将网站的 PHP 版本升级到 7.3 后,我开始收到此错误消息: Recoverable fatal error: ini_set(): Cannot set 'user' save handler
php5.3.3以前php-fpm还没有被php收录,配置php基本都在php.ini里面,php5.3.3及以后,除了在php.ini配置以外,还可以在php-fpm.conf里面配置。 多个地方
如果 session.save_handler 设置为内存缓存,Phpmyadmin 将无法工作。我一登录就收到您的 session 已过期,请重新登录 php.ini session.save_ha
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试从元素周期表的较大图像中裁剪特定元素,然后将它们保存在特定的文件目录中,该文件目录位于另一个文件夹内,并且该文件夹与程序位于同一文件目录中我正在尝试这样做。 我查看了另一个有关堆栈溢出的已回
我是一名优秀的程序员,十分优秀!