标签: php7

在 Ubuntu 16.04、Apache 上从 PHP 7.2 切换到 7.1

我需要在 Ubuntu 16.0.4 上将其中一台 VM 上的 PHP 从 7.2 降级到 7.1。上次我尝试仅删除 PHP 并用不同版本替换它时,我遇到了 Apache 和 MySQL 的各种问题。是否有一种快速的方法可以将 PHP 从 7.2 降级到 7.1,而无需完全重新安装和配置 Apache(撰写本文时的最新版本)以及服务器上的其他所有内容?

由于我从声称他们的应用程序在 PHP 7.2 上运行的软件供应商那里收到的错误信息,我不得不降级。原来它必须有7.1。

我尝试寻找有关如何从 7.2 降级到 7.1 的信息,但只能获得“升级”结果。

感谢您的帮助。

php apache-2.4 php7 ubuntu-16.04

32
推荐指数
3
解决办法
11万
查看次数

使用 PHP7 的 fastcgi_pass 权限被拒绝

我正在使用 PHP7.0 运行 LEMP。

我的服务器块中有这个

fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
Run Code Online (Sandbox Code Playgroud)

但是当我打开网站时,它返回一个 502 Bad Gateway。下面是错误日志。

*1 connect() to unix:/var/run/php/php7.0-fpm.sock failed (13: Permission denied) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: example.com, request: "GET / HTTP1.1", upstream: "fsatcgi://unix:/var/run/php/php7.0-fpm.sock:", host: "example.com"
Run Code Online (Sandbox Code Playgroud)

它说Permission Denied。这里有什么问题?我已经检查过,但我似乎无法找到需要给予什么样的许可。

谢谢你。

php nginx php7

26
推荐指数
2
解决办法
6万
查看次数

Nginx 缓存符号链接

我的 Web 服务器上有一个部署系统,每次部署应用程序时,它都会创建一个新的带时间戳的目录,并将“当前”符号链接到新目录。这一切在 apache 上都运行良好,但在我设置的新 nginx 服务器上,看起来正在运行来自“旧”部署的脚本而不是新的符号链接脚本。

我已经阅读了一些关于如何解决这个问题的教程和帖子,但没有太多信息,似乎没有任何效果。这是我的 vhost 文件:

server {
    listen 80;

    server_name ~^(www\.)?(?<sname>.+?).testing.domain.com$;
    root /var/www/$sname/current/public;
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~* \.(jpg|jpeg|gif|png|bmp|ico|pdf|flv|swf|exe|html|htm|txt|css|js) {
        add_header        Cache-Control public;
        add_header        Cache-Control must-revalidate;
        expires           7d;
    }

    location ~ \.php$ {
        #fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        include fastcgi_params;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }

    location ~ /\.ht {
        deny all;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的 fastcgi_params:

fastcgi_param   SCRIPT_FILENAME         $document_root$fastcgi_script_name;
fastcgi_param   QUERY_STRING        $query_string;
fastcgi_param   REQUEST_METHOD …
Run Code Online (Sandbox Code Playgroud)

nginx cache php-fpm php7

14
推荐指数
1
解决办法
1万
查看次数

将 apache 从 prefork 切换到 Ubuntu 16 中的事件,让 php 7 正常工作

Apache 在生产中运行缓慢。搜索了一段时间的答案后,我终于去了#apache IRC频道,专业人士让我用这个命令检查apache模式:

sudo apachectl -V
Run Code Online (Sandbox Code Playgroud)

并且惊讶地发现Server MPMprefork。他们强调说不要在生产服务器上使用 PREFORK。事实证明,Ubuntu 软件包(大概是从 Debian 继承的?)坚持在 prefork 模式下运行 apache,尽管推荐的使用 Apache 运行 PHP 的方法明确推荐了 proxy_fcgi 和 php-fpm,然后是 fcgid 并最终说你不应该使用预分叉:

为什么你不应该再将 mod_php 与 prefork mpm 一起使用

  • mod_php 一直加载到每个 httpd 进程中。即使当 httpd 提供静态/非 php 内容时,该内存也在使用中。
  • mod_php 不是线程安全的,并迫使您坚持使用 prefork mpm(多进程,无线程),这是最慢的配置

该页面还包含有关 PHP-FPM 的一些详细信息,但这似乎有点复杂和不清楚,并且似乎涉及很多手动配置。我很失望也很惊讶 Ubuntu 16 没有用于 fastCGI 模式或其他东西的包选项。

我尝试使用 a2enmod将 apache 切换到事件模式,当我尝试启动 apache 备份时,出现错误:

Apache 正在运行线程 MPM,但您的 PHP 模块未编译为线程安全的。你需要重新编译PHP

无论如何,我想知道是否有人有一些最小的分步说明,以通过尽可能依赖软件包安装程序在带有 PHP 7.0 …

php-fpm apache-2.4 php7 ubuntu-16.04 mpm-event

14
推荐指数
2
解决办法
3万
查看次数

使用 Nginx 在 PHP-FPM 7 上启用错误日志记录?

这与这些问题基本相同:

/sf/ask/607424541/

Nginx 不记录 PHP 错误

但是那里的答案似乎不适用于带有 PHP 7 的 Ubuntu 16.04。

/etc/php/7.0/fpm/pool.d/www.conf

catch_workers_output = yes
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
Run Code Online (Sandbox Code Playgroud)

/var/log/fpm-php.www.log存在并归www-data.

/etc/php/7.0/fpm/php.ini

log_errors = On
Run Code Online (Sandbox Code Playgroud)

Nginx 虚拟主机的服务器块

access_log /var/log/myapp/access.log;
error_log /var/log/myapp/error.log error;
Run Code Online (Sandbox Code Playgroud)

/var/log/myapp/access.log 存在并归www-data.

但是当发生错误时,我在任何指定的日志文件中都没有收到错误,并且在任何其他地方也找不到它。

我浏览了关于另一个问题的所有建议,但没有找到任何有效的答案。我假设自从这些答案发布以来,情况已经发生了变化。有什么建议?

nginx php-fpm php7 ubuntu-16.04

10
推荐指数
1
解决办法
4万
查看次数

如何强行彻底清除PHP7 opcache?

我的网络服务器上的 opcache 一直达到我设置的限制,即使我觉得我没有那么多 PHP 代码,它真的应该有足够的空间。

更糟糕的是,即使在清除 opcache 时,它​​也会立即显示超过 2/3 的可用空间已被填充。

刚才的例子:

运行 opcache_reset() 之前的 phpinfo 片段:

Used memory     122958472
Free memory     5552 
Run Code Online (Sandbox Code Playgroud)

运行 opcache_reset() 后的 phpinfo 片段:

Used memory     90691312
Free memory     43526416
Run Code Online (Sandbox Code Playgroud)

我知道在 PHP7 中,opcache(显然)备份到磁盘,所以也许东西正在自动重新加载?但这似乎违背了重置 opcache 的目的,我不知道 opcache 备份到磁盘上的哪个位置,所以我无法检查。

我正在 nginx 上运行 PHP-FPM,准确地说是 vesion 7.0.15-0ubuntu0.16.04.4。

php php-fpm opcache php7

10
推荐指数
1
解决办法
2万
查看次数

正确理解 pm.max_children 调优

我做了一些调查,发现这个可以计算和调整pm.max_children

https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/

但例如:

  • 我的服务器上有 8Gb
  • 我正在托管 30 个网站
  • php-fpm 平均进程大小约为 40mb
  • php-fpm 最大进程大小约为 80mb
  • 我想为 php-fpm 进程分配最大 5Gb 的内存

如果我应用这个:

pm.max_children = 专用于 Web 服务器的总 RAM / 最大子进程大小

所以在我的情况下:

pm.max_children = 5120 / 80 = 64

但是如果我在每个 php-fpm 网站 conf 文件上添加pm.max_children = 64,这意味着每个网站都可以使用64个子进程X 1 个进程的大小(例如40mb)= 2560Mb

如果我们想象,同时所有 30 个网站都达到了 pm.max_children 值,我们将有:2560Mb(每个网站的最大值)x 30 个网站 = 76 800 Mb

我对么?

Si 是的,这意味着当许多网站托管在同一台服务器上时,我们必须将计算结果pm.max_children = 5120 / 80 = …

memory nginx web-server php-fpm php7

8
推荐指数
1
解决办法
3万
查看次数

PHP7 中的 PECL 命令错误

我已将 php 升级到第 7 版,现在我在使用 pecl 命令时遇到了问题。当我运行时,sudo pecl install mongo我得到一长串错误:

Warning: Invalid argument supplied for foreach() in Command.php on line 249

Warning: Invalid argument supplied for foreach() in /usr/share/php/PEAR/Command.php on line 249

Warning: Invalid argument supplied for foreach() in Command.php on line 249

Warning: Invalid argument supplied for foreach() in /usr/share/php/PEAR/Command.php on line 249

Warning: Invalid argument supplied for foreach() in Command.php on line 249

Warning: Invalid argument supplied for foreach() in /usr/share/php/PEAR/Command.php on line 249
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个问题的解决方案:PECL …

ubuntu php pecl php7

7
推荐指数
2
解决办法
1万
查看次数

Apache 上 CentOS 7 上的 HTTP/2 和 PHP7

经过一些研究,我找不到答案:如何将Apache/httpd更新到最新版本以在我的 VPS 上使用 HTTP/2 协议。我正在使用 PHP7 和基于 Apache - CentOS 7 的服务器。

CentOS 默认存储库上没有软件包更新。

[root@vps270238 ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Nov 19 2015 21:43:13
Run Code Online (Sandbox Code Playgroud)

我真的想保留我的实际设置和虚拟主机。

apache-2.4 centos7 php7 http2

7
推荐指数
2
解决办法
2万
查看次数

在 php7 中启用 sqlite3

我想在 php.ini 中启用 sqlite3 但是当我尝试加载 PHP 脚本时会发生此错误:

PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/sqlite.so' - /usr/lib/php/20151012/sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/pdo_sqlite.so' - /usr/lib/php/20151012/pdo_sqlite.so: undefined symbol: php_pdo_unregister_driver in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)

但是这个路径中的库是存在的

/usr/lib/php/20151012/sqlite.so
Run Code Online (Sandbox Code Playgroud)

在我的 php.ini 中只更改这一行

extension=pdo_sqlite.so
Run Code Online (Sandbox Code Playgroud)

我的操作系统是:Debian GNU/Linux 9.4 (stretch)

linux sqlite php7

6
推荐指数
1
解决办法
2万
查看次数