Heroku本地PHP在Mac OS X上

eufgjt7s  于 2023-04-06  发布在  PHP
关注(0)|答案(1)|浏览(193)

目前,我只是使用额外的终端选项卡来手动启动worker和clock进程,以及始终在线的apache代理到php-fpm。
当我开始使用heroku时,我尝试了heroku local,但它的设置击败了我。
现在我想给予一次。
我用homebrewphp在High Sierra上运行,但到目前为止我一直坚持使用内置apache的mac os,看起来brew的apache可能是一个更好的选择,但希望我们能在下面找到答案。
我从这里提供的答案(由buildpack的顶级贡献者提供)中意识到,heroku local使用的apache必须在heroku local启动时停止,在heroku支持的答案here中也有类似的引用。
我还注意到,我自己的发现是,应该像在composer require --dev heroku/heroku-buildpack-php "*"中一样在本地安装buildpack,以确保最新版本。
现在,当我使用mac osx的内置apache(我让它监听端口8080以服务于我的php开发环境,但为了这个目的,用sudo apachectl stop停止了它)发出heroku local时,我得到了以下结果。

m$ heroku local
[OKAY] Loaded ENV .env File as KEY=VALUE Format
12:21:03 PM horizon.1 |  Horizon started successfully.
12:21:03 PM clock.1  |  [2019-09-20 11:21:03] Calling scheduler
12:21:03 PM clock.1  |  No scheduled commands are ready to run.
12:21:03 PM web.1    |  DOCUMENT_ROOT changed to 'public/'
12:21:04 PM web.1    |  4 processes at 128MB memory limit.
12:21:04 PM web.1    |  Starting php-fpm...
12:21:06 PM web.1    |  Starting httpd...
12:21:06 PM web.1    |  Application ready for connections on port 5000.
12:21:06 PM web.1    |  [Fri Sep 20 12:21:06.155117 2019] [core:emerg] [pid 25867] (2)No such file or directory: AH00023: Couldn't create the mpm-accept mutex (file /private/var/run/mpm-accept-0.25867)
12:21:06 PM web.1    |  (2)No such file or directory: could not create accept mutex
12:21:06 PM web.1    |  AH00015: Unable to open logs
12:21:06 PM web.1    |  Process exited unexpectedly: httpd
12:21:06 PM web.1    |  Going down, terminating child processes...
[DONE] Killing all processes with signal  SIGINT
12:21:06 PM horizon.1 |  Shutting down...
12:21:06 PM clock.1  Exited with exit code SIGINT
12:21:06 PM web.1    Exited with exit code null
12:21:07 PM horizon.1 |  [2019-09-20 11:21:06][1033] Processing: Laravel\Scout\Jobs\MakeSearchable
12:21:07 PM horizon.1 |  [2019-09-20 11:21:06][1032] Processing: Laravel\Scout\Jobs\MakeSearchable
12:21:07 PM horizon.1 |  [2019-09-20 11:21:06][1034] Processing: Laravel\Scout\Jobs\MakeSearchable
12:21:08 PM horizon.1 |  [2019-09-20 11:21:06][1033] Processed:  Laravel\Scout\Jobs\MakeSearchable
12:21:08 PM horizon.1 |  [2019-09-20 11:21:06][1032] Processed:  Laravel\Scout\Jobs\MakeSearchable
12:21:08 PM horizon.1 |  [2019-09-20 11:21:06][1034] Processed:  Laravel\Scout\Jobs\MakeSearchable
12:21:08 PM horizon.1 Exited Successfully

我的mac os apache vhosts转发到/tmp/php72-fpm.sock。权限没有问题,因为本地浏览器中的apache达到php-fpm。
我看到实际的错误是(由于没有换行符,它在上面的代码中向右滚动):Could not create the mpm-accept mutex。我现在知道有几个不同的apache多处理模块,不确定我是否需要了解更多。
我注意到mac osx apache需要sudo,就像在sudo apachectl start中一样,我正在运行heroku local而没有sudo,我可以尝试sudo heroku local,但在我知道它会做什么之前,我宁愿不尝试。
因此,在没有更多理解的情况下(这将是很好的),我可能会尝试安装brew apache(httpd 24).看起来heroku local只会调用httpd,所以,路径中的第一个将被选中。

部分回答

我意识到当heroku local启动系统apache时,系统apache当然仍然会有它当前的所有配置。这意味着写入sudo位置,错误日志,我添加的vhosts。当然,如果没有sudo,这将出错。修复上述问题的第一步是从httpd.conf中删除listen指令,这会产生一个新的错误:

(13)Permission denied: AH00091: httpd: could not open error log file /private/var/log/apache2/error_log.

然后我注解了errorlog来修复这个,这给了另一个:

(2)No such file or directory: AH02291: Cannot access directory '/usr/logs/' for main error log
2:17:25 PM web.1    |  AH00014: Configuration check failed
2:17:25 PM web.1    |  This program requires Apache 2.4.10 or newer with mod_proxy and mod_proxy_fcgi enabled; check your 'httpd' command.

可以看到这是怎么回事。基本上,我将需要删除几乎所有我的mac osx apaches配置,使它不会出错(当启动没有sudo)。
因此,让我们考虑使用brew apache代替...(如下)。
值得注意的是,检查/tmp,每次我运行heroku local时,我都会看到下面的文件,如heroku.xxxxx,写在零字节以下。我注意到下面的apache日志文件可以作为日志指令在构建包的默认vhost中找到,在<buildpack>/conf/apache2/heroku.conf中,因此它们存在于这里。

mbp:tmp m$ ll
total 8
drwxrwxrwt@ 16 root  wheel   512B 20 Sep 08:54 ./
drwxr-xr-x   6 root  wheel   192B 31 Dec  2017 ../
srwxrwxrwx   1 root  wheel     0B 18 Sep 22:02 .dbfseventsd=
srwxrwxrwx   1 m     wheel     0B 20 Sep 07:59 .s.PGSQL.5432=
-rw-------   1 m     wheel    49B 20 Sep 07:59 .s.PGSQL.5432.lock
srwxr-xr-x   1 m     wheel     0B  8 Sep 21:05 OSL_PIPE_501_SingleOfficeIPC_48607cb6b283d6f2d9ab5973acdb43c=
drwx------   3 m     wheel    96B 27 Aug 17:28 com.apple.launchd.9wuyYAXuof/
drwx------   3 m     wheel    96B 27 Aug 17:28 com.apple.launchd.v9lh33yWhI/
-rw-r--r--   1 m     wheel     0B 20 Sep 08:54 heroku.apache2_access.5000.log
-rw-r--r--   1 m     wheel     0B 20 Sep 08:54 heroku.apache2_error.5000.log
-rw-r--r--   1 m     wheel     0B 20 Sep 08:54 heroku.php-fpm.5000.log
-rw-r--r--   1 m     wheel     0B 20 Sep 08:54 heroku.php-fpm.5000.www.slowlog
-rw-r--r--   1 m     wheel     0B 20 Sep 08:54 heroku.php-fpm.www.5000.log
drwxr-xr-x   3 m     wheel    96B 19 Sep 20:23 pear/
srwxrwxrwx   1 m     staff     0B 19 Sep 22:11 php72-fpm.sock=
drwxr-xr-x   2 root  wheel    64B 19 Sep 08:29 powerlog/

我还能做些什么来帮助Web进程加速?

更新-如何安装brew apache独占heroku local?

也许真正有用的是知道安装brew apache的步骤,因为它只用于heroku本地。是一些简单的brew命令并删除listen指令吗?我在这里很谨慎,因为我希望不损害我目前对内置apache的使用;我认为这些应该能够彼此并行运行,只是在我这样做之前需要合理地确定。

还有

Homebrew现在不再支持公式的选项,所以上面链接中给出的brew install homebrew/apache/httpd24 --with-mpm-event似乎不再是一个选项了。有必要吗?正确的安装步骤是什么?

rdrgkggo

rdrgkggo1#

我在这里发布了一个部分答案,我会在发现更多信息时更新,而不是将这些进一步的信息附加到问题本身。
我用brew apache得到了它,如下:
brew install httpd
编辑/usr/local/etc/httpd/httpd.conf

  • 注解出行Listen 8080
  • LoadModule proxy_module lib/httpd/modules/mod_proxy.so中的注解
  • LoadModule proxy_fcgi_module lib/httpd/modules/mod_proxy_fcgi.so中的注解
  • 注解,我将其设置为ServerName localhost:5000(这将抑制它将发出的投诉-这是ServerName的正确值吗?)

编辑/usr/local/etc/httpd/extra/httpd-ssl.conf如下:

  • 注解掉Listen 8443

不要执行brew services start httpd,就像你通常对brew服务那样,这与我们无关。(现在我们注解掉了Listen指令,httpd无论如何都不会响应,直到heroku local启动它 * 并注入 * 一个Listen指令)。
有一个地方我还没有完全理解。当我现在运行heroku local时,我可以在localhost:5000访问我的网站,但只有首页。点击任何子页面返回:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>
</body></html>

也许我们以后可以修正这个问题,但是现在让我们考虑一下php-fpm。
首先,我有一个很容易修复的错误,那就是heroku local使用的是mac osx的php-fpm(在我的High Sierra上是7.1版),我通过确保我的php7.2公式(仅适用于小桶;我将很快转移到php7.3)首先在路径中。现在which php-fpm返回/usr/local/opt/php@7.2/sbin/php-fpm而不是/usr/sbin/php-fpm(mac osx内置)。所以,现在我们使用我们想要的版本得到了它。小但重要的修复。
然而,我们现在必须考虑当heroku local调用(即启动)php-fpm时会发生什么。传统上,我会执行brew services start php@7.2,它始终处于打开状态(守护进程)。然而,打开Activity Monitor,我看到heroku local生成了一个新的父进程和worker。也许这就是它应该的样子。它只是忽略了由brew services运行的示例,并创建了自己的示例。
当我按下Ctrl-C退出Heroku local时,问题就出现了。这是正确的退出方式吗?如果我按下Ctrl-C,我会得到命令提示符,但是,在Activity Monitor中查看派生的php-fpm进程,php-fpm示例不会终止。然后,如果我在第一次停止heroku local后第二次发出heroku local,我会得到这样的结果:

5:44:37 PM web.1    |  [20-Sep-2019 17:44:37] ERROR: An another FPM instance seems to already listen on /tmp/heroku.fcgi.5000.sock
5:44:37 PM web.1    |  [20-Sep-2019 17:44:37] ERROR: FPM initialization failed

…这是可以理解的。这可以通过在活动监视器中手动终止进程来解决。然而,我想知道这里发生了什么;如何正确地终止heroku local?
具体来说,Ctrl-C退出了一个父进程为node的php进程,但没有退出五个php-fpm进程,其中一个进程是其他四个进程的父进程,而另一个进程的父进程是bash。
所以,我们今天已经走了很长的路;剩下的问题似乎仍需改进:
1.如何正确地终止php-fpm进程(Ctrl-C不会这样做).另外,如果我有两个终端打开,其中一个以前运行heroku本地,我在另一个窗口中再次运行它,该窗口显示一个常规的命令提示符等待指令,突然跳回到生活,接收新的信息,这是一个但令人惊讶的,我想知道这是如何工作的,如果这被认为是正常的.
1.找出为什么apache不为上面提到的root以外的页面提供服务。

成功了!

我在/usr/local/etc/httpd/httpd.conf中忽略的一个重要更改是在行中注解:
LoadModule rewrite_module lib/httpd/modules/mod_rewrite.so
我使用的是laravel,它通过index.php为所有页面提供服务。这意味着你想重写不是index.php的每个页面请求回到index.php。因此,laravel中的默认.htaccess有一行RewriteRule ^ index.php [L],它就是这样做的...
现在唯一剩下的问题,我目前知道的是,Ctrl-C不会终止子进程......但首先我要设置我所有的本地应用程序使用fpm 7.3,因为我看到了一个参考,特别是在buildpack 7.3,所以想知道如果这可能有帮助......

相关问题