Mac OS X 上的 Heroku Local 和 PHP

2024-03-18

目前,除了始终在线的 apache 代理 php-fpm 之外,我只使用额外的终端选项卡来手动启动工作进程和时钟进程。

当我开始使用heroku时,我尝试了heroku local,但它的设置打败了我。

现在我想再试一次。

我在 High Sierra 上homebrew php但到目前为止一直坚持使用 apache 内置的 mac 操作系统。看来brew 的apache 可能是更好的选择,但希望我们能在下文中找到答案。

我从提供的答案中意识到here https://stackoverflow.com/questions/36362484/heroku-php-getting-started-doesn-t-run-locally-on-osx/36449401#36449401(由 bu​​ildpack 的顶级贡献者提出)heroku local 使用的 apache 必须在启动 heroku local 时停止。在一个答案中,heroku 支持对此有类似的明显引用here https://stackoverflow.com/questions/33015139/laravel-5-heroku-local-doesnt-work.

我还注意到,我自己的发现,应该在本地安装构建包* as in composer require --dev heroku/heroku-buildpack-php "*"以保证最新版本。

现在,当我使用 mac osx 的内置 apache 发出 heroku local 时,我得到以下信息(我让它监听端口 8080 来为我的 php 开发环境提供服务,但为此目的停止了它,使用sudo apachectl stop).

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 (httpd24)。看起来 heroku local 只会调用httpd,因此,将选取路径中的第一个。

部分答案

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

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

然后我注释掉错误日志来修复该错误日志,这又给出了另一个错误日志:

(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 日志文件可以作为 Log 指令在构建包中包含的默认 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/

我还能做些什么来帮助网络进程启动?

更新-如何安装brew apache 专用于heroku local?

也许真正有用的是了解安装brew apache 的步骤,因为它仅用于heroku local。是一些简单的brew命令并删除listen指令吗?我在这里很谨慎,因为我希望最好不要损害我当前对内置 apache 的使用;我认为这些应该能够并行运行,只需要在执行之前进行合理确定即可。

Also

Homebrew 现在不再支持公式选项,因此brew install homebrew/apache/httpd24 --with-mpm-event如给定的在上面的链接 https://stackoverflow.com/questions/36362484/heroku-php-getting-started-doesn-t-run-locally-on-osx/36449401#36449401似乎不再是一个选择。这是可以做的brew edit httpd24直接编辑公式;有必要吗?正确的安装步骤是什么?


我在这里发布了部分答案,当我发现更多信息时我会更新该答案,而不是将这些进一步的信息附加到问题本身。

我让它与brew apache一起工作,如下所示:

brew install httpd

Edit /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 中的注释,我将其设置为ServerName localhost:5000(这会抑制它将发出的投诉 - 这是 ServerName 的正确值吗?)

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

  • 注释掉Listen 8443

不要这样做brew services start httpd,就像您通常对酿造服务所做的那样,这与我们在这里无关。 (现在我们注释掉了 Listen 指令,httpd 无论如何都不会响应, 直到heroku local启动它并注入聆听指令)。

有一个领域我还没有完全理解。 当我现在运行 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 公式(仅是 keg;我很快就会移动到 php7.3) 在路径中排在第一位。 现在which php-fpm回报/usr/local/opt/[email protected] /cdn-cgi/l/email-protection/sbin/php-fpm并不是/usr/sbin/php-fpm(mac osx 内置)。所以,现在我们使用我们想要的版本得到了它。小但重要的修复。

然而,我们现在必须考虑当heroku本地调用(即启动)php-fpm时会发生什么。传统上,我这样做brew services start [email protected] /cdn-cgi/l/email-protection,始终处于开启状态(守护进程)。然而,当活动监视器打开时,我看到 heroku local 生成了一个新的父进程和工作人员。或许事情本来就该如此。它只是忽略运行的实例brew services,并创建自己的。

但当我按 Ctrl-C 退出 Heroku local 时,谜团就出现了。这是退出的正确方法吗?如果我执行 Ctrl-C,我会返回命令提示符,但是,查看活动监视器中生成的 php-fpm 进程,php-fpm 实例不会终止。然后,如果我在第一次停止后第二次发出 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 进程,但不退出 5 个 php-fpm 进程,其中 5 个进程是其他 4 个进程的父进程,并且该进程具有 bash 父进程。

所以,今天我们已经走了很长的路;剩下的问题似乎是;仍有待改进:

  1. 如何正确终止 php-fpm 进程(Ctrl-C 不起作用)。 另外,如果我打开了两个终端,其中一个之前运行过heroku local, 我在另一个窗口中再次运行它,该窗口显示了常规命令 提示等待指令,突然起死回生,接收新的 信息,这是一个但令人惊讶的信息,我想知道它是如何工作的,如果 这被认为是正常的。

  2. 找出为什么 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,正如我在专门针对 7.3 的 buildpack,所以想知道这是否有帮助......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mac OS X 上的 Heroku Local 和 PHP 的相关文章

随机推荐

  • JScrollPane 无法在空布局中工作

    import javax swing JCheckBox import javax swing JFrame import javax swing JLabel import javax swing JPanel import javax
  • .jcall(cell, "V", "setCellValue", value) 中的错误:尝试 write.xlsx 时未找到带有签名 ([D)V 的 setCellValue 方法

    library dtplyr library xlsx library lubridate data frame 612 obs of 7 variables Company Factor w 10 levels Harbor HCG 6
  • JQuery:委托和日期选择器

    我需要给定类中的每个文本输入都是一个日期选择器 就像是 input type text time datepicker 但我通过 Jquery load 添加了很多代码 所以我相信我需要一个委托 问题是我不知道该怎么做 因为据我所知 加载事
  • Ninject 3.0 MVC kernel.bind 错误自动注册

    kernel Bind 上的获取和错误scanner gt 在 VS 2010 中 scanner 下面有一条小错误线 无法将 lambda 表达式转换为类型 System Type 因为它不是代表 类型 尝试像 2 0 中的旧 kerne
  • Xcode 7:将数组控制器绑定到单选按钮组

    我有一小组对象 用户应该能够使用单选按钮组从中选择一个对象 这些对象已绑定到数组控制器 有没有办法将该阵列控制器绑定到单选按钮组 以便动态生成其他单选按钮 如果可能 首选 IB 解决方案 示例项目 https scriptreactor c
  • 无法为 Kindle Fire HD 安装 ADB

    我正在尝试root它 尽管在我安装了正确的ADB驱动程序之后 当我插入我的Kindle fire HD 7 时 点燃火 gt Android 复合 ADB 接口 没有出现在设备管理器中 因此我无法执行root 我已将 0x1949 添加到
  • Elasticsearch 使用 jest 通过查询删除[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我发现一个有趣的功能叫做通过查询删除 https www elastic co guide en el
  • 如何使用 python 从文本文件的行中读取特定字符?

    我有多个 txt 文件 其中包含与此类似的多行 class1 1 28 9 315 13 354227 2 36 247 17 342 8 34 14 3825 class2 14 31 8679 7 32 3582 2 32 4127 1
  • 组合常见搭配的 NLP 流程

    我有一个语料库 我在 R 中使用 tm 包 并且还在 python 中的 NLTK 中镜像相同的脚本 我正在使用一元组 但希望某种解析器能够将通常位于同一位置的单词组合成一个单词 即 我不想再在我的单词中分别看到 New 和 York 当它
  • Matlab 替换轴范围

    我的 x 轴从 0 到 96 其中每个数字代表一天中的一刻钟 96 4 24 小时 我需要轴来显示 0 到 24 小时 有没有办法在绘图后仅修改轴 您可以使用 gt gt set gca XTick 0 4 96 gt gt set gca
  • 如何将嵌套字典传递给 Flask 的 GET 请求处理程序

    我试图将嵌套字典作为参数传递给 GET 请求 该请求由 Flask 工作线程处理 整个设置是Nginx Gunicorn Flask 在客户端 我正在执行以下操作 import requests def find cabin party P
  • Numpy:了解行名称的 numpy 数组概念

    也许是一个非常模糊的问题 但是挖掘 numpy 上的链接对我没有帮助 我需要使用以下分层聚类对如下所示的二进制数组进行相似度矩阵计算 name val1 val2 val3 val4 val5 comp1 0 0 1 0 1 comp2 1
  • 使用PHP批量删除域共享联系人

    我正在使用 Google API PHP客户端库 v2 1 3 https github com google google api php client 我正在关注以下文档域共享联系人 https developers google co
  • 使 saxon-c 在 Python 中可用

    我刚刚读到 Saxon 现在可用于 Python 这非常有趣而且很好 但是任何人都可以写一篇关于如何使其可用于 Python Anaconda WingIDE 或类似的教程吗 我习惯于使用 pip 或 conda 安装 并指向一个包 轮子以
  • xcode 5 问题:“iOS 模拟器无法安装应用程序”

    我刚刚将我的 xcode 版本升级到 5 0 运行应用程序 2 3 次后 它给我这样的错误 iOS模拟器无法安装应用程序 这在旧的 xcode 中工作正常 当我重置模拟器时 它工作正常 但这一次又一次令人恼火 谁能告诉我真正的问题是什么 我
  • DateTimePicker 显示今天的日期而不是显示其实际值

    我们在表单上的自定义用户控件上有几个 DateTimePicker 它们是可见的 但未启用 仅用于显示目的 当加载 UserControl 时 DateTimePicker 会从来自 DataSet 的 DataRow 分配值 该 Data
  • 什么时候需要在 Ruby C 扩展中声明易失性值?

    我找不到太多关于何时适合声明的文档VALUE as volatileRuby 扩展中以避免过早对正在使用的对象进行垃圾回收 这是我到目前为止所学到的 有人可以填空吗 When volatile does not需要使用 在 C 对象成员中
  • 获取线程的输出

    您认为获取线程工作结果的最佳方式是什么 想象一个线程执行一些计算 如何警告主程序计算已完成 您可以每隔 X 毫秒轮询一些名为 作业完成 的公共变量或顺便说一句 但是您会收到比可用结果更晚的结果 主代码将浪费时间等待它们 另一方面 如果您使用
  • 如何从文件(即 SVG)创建 CGPath

    是否可以从给定文件创建 CGPath SVG 是首选 但任何东西都可以 袖珍SVG https github com arielelkin PocketSVG会将 SVG 文件转换为 UIBezierPath 从中您可以获得 CGPath
  • Mac OS X 上的 Heroku Local 和 PHP

    目前 除了始终在线的 apache 代理 php fpm 之外 我只使用额外的终端选项卡来手动启动工作进程和时钟进程 当我开始使用heroku时 我尝试了heroku local 但它的设置打败了我 现在我想再试一次 我在 High Sie