macOS Sierra中的更改阻止了“说”在PHP脚本中执行

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了macOS Sierra中的更改阻止了“说”在PHP脚本中执行脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个带有一个站点的macOS服务器,它使用say命令将文本片段转换为音频.

随着升级到Sierra,一切顺利,除了一件事:当我的PHP脚本中的exec()包装时,say命令不再起作用.

页面刚刚超时.也没有发现任何错误.

<?PHP
    try {
        exec('/usr/bin/say "hello"');
    }
    catch (Exception $e) { echo $e->getMessage(); }
?>

通常我会使用say -o filename保存音频片段,但我尝试了所有变体以及其他正常工作的shell命令,包括在我的输出文件夹中创建文件.

有趣的是,如果我从命令行运行它,它可以工作 – 要么大声说,要么创建一个输出文件.

macOS Sierra有PHP 5.6.24所以我认为safe_mode不适用,righht?

我想强调的是,使用新操作系统,PHP或say命令的更改是最新的.是的我确实调查并尝试了不同的输出和stderr重定向,但脚本只是挂起.

在ActivITy Viewer中查看say命令(相当于顶层的GUI),我尝试对其进行采样,不确定它是否有帮助:

2695 Thread_1742595   DispatchQueue_1: com.apple.main-thread  (serial)
+ 2695 start  (in libdyld.dylib) + 1  [0x7fffb0f58255]
+   2695 ???  (in say)  load address 0X10907d000 + 0x1fac  [0x10907efac]
+     2695 NewSPEechChannel  (in SpeechSynthesis) + 52  [0x7fff9acd3F19]
+       2695 SpeechChannelHandle::SpeechChannelHandle()  (in SpeechSynthesis) + 265  [0x7fff9acd797f]
+         2695 dispatch_once_f  (in libdispatch.dylib) + 38  [0x7fffb0f220e5]
+           2695 _dispatch_client_callout  (in libdispatch.dylib) + 8  [0x7fffb0f22128]
+             2695 ___Zn13SpeechGlobals8InstanceEv_block_invoke  (in SpeechSynthesis) + 28  [0x7fff9acd54da]
+               2695 SpeechGlobals::SpeechGlobals()  (in SpeechSynthesis) + 471  [0x7fff9acd56db]
+                 2695 xpc_connection_send_message_with_reply_sync  (in libxpc.dylib) + 154  [0x7fffb11b65a8]
+                   2695 dispatch_mach_send_with_result_and_wait_for_reply  (in libdispatch.dylib) + 45  [0x7fffb0f3CF39]
+                     2695 _dispatch_mach_send_and_wait_for_reply  (in libdispatch.dylib) + 591  [0x7fffb0f3CAD4]
+                       2695 mach_msg  (in libsystem_kernel.dylib) + 55  [0x7fffb107e867]
+                         2695 mach_msg_trap  (in libsystem_kernel.dylib) + 10  [0x7fffb107f41a]
2695 Thread_1742600
  2695 start_wqthread  (in libsystem_pthread.dylib) + 13  [0x7fffb116f211]
    2695 _pthread_wqthread  (in libsystem_pthread.dylib) + 1426  [0x7fffb116f7b5]
      2695 __workq_kernreturn  (in libsystem_kernel.dylib) + 10  [0x7fffb10874e6]

这些是统计数据:

macOS Sierra中的更改阻止了“说”在PHP脚本中执行

从打开的文件和端口,我可以看到我将stdout和stderr都设置为/ PRivate / VAR / LOG / apache2 / error_log,但根本没有任何显示.

此外,试图通过更精细的运行捕获输出,但没有快乐,只是超时(脚本文件夹也是可写的):

<?PHP   
    try {
        $pipes = array();
        proc_close(proc_open("say hi",array(0 => array("pipe","r"),1 => array("pipe",2 => array("pipe","r")),$pipes,dirname(__FILE__),null));
    } catch (Exception $e) { error_log($e->getMessage()); }
?>

更新:High Sierra是一样的.

最终更新:安装Mojave后,删除了大部分Server.app功能,我添加了MAMP来处理这个任务.如果你愿意,可以自己听听 – 这是在macspeaks.com.

解决方法

我也经历过同样的问题.

这是我刚刚提出的解决方法,但老实说,我认为这是一个很大的麻烦只是为了能够从基于apache的PHP脚本播放音频.我对于为什么会发生这种情况有一些想法,但经过多次测试,我似乎破坏了我自己的理论.我认为这可能与没有活跃的TTY有关.我无法通过启动带有sudo -i的shell来播放音频,而且还有许多来自PHP的其他功能,但我能够使用来自本地终端的所有相同命令播放音频,事实证明,也是通过SSH进入脑,导致我最新的解决方案.再一次,我认为这是过度杀伤,但到目前为止,我能够在我的基于Web的PHP驱动脚本(主要是地理围栏相关的)中获得音频的唯一方法.

所以,我们走了,是的,我理解这涉及的风险和愚蠢:

在我的PHP脚本中,我使用与此类似的命令在/ tmp目录中生成一个音频文件

exec "sudo -u <username> /usr/bin/say -o /tmp/outputfile.aiff --voice=Ava \"<What to Say>\"";

然后在生成音频文件之后,我发现从apache / PHP中播放它(并实际听到输出)的唯一方法是使用expect脚本在本地ssh并播放它.所以我的下一行是:

exec "sudo -u <username> -i ~<username>/expectscript";

我期望的脚本如下:

#!/usr/bin/expect -f

spawn /usr/bin/ssh localhost
expect "Password"
send "<PASSWORD>\r"
expect "<username>"
send "/usr/bin/afplay /tmp/outputfile.aiff\r"
expect "<username>"
send "/usr/bin/touch /tmp/touchthis\r"
expect "<username>"
send "exit\r"

确保替换所有<用户名>上面有你的用户名(显然没有<>)和< PASSWORD>用你的密码.如果您的bash提示不包含您的用户名,您可能需要调整expect脚本,因为这是我在expect脚本中用来查找返回的提示.触摸只是为了确定期望脚本是否有效,并且您可以参考上次触摸文件的时间.

我希望这开启了关于实际导致这种情况的讨论,我们可以确定一个更合理的解决方案.我找了很多兔子试图寻找不同的方法来实现这一点,我创建了Automator应用程序并从PHP调用了它们(没有用.)我在shell中作为我的用户启动了shell,所有命令的执行总是成功完成,没有音频输出.我尝试过的所有解决方案都可以在终端(甚至是终端的PHP)中正常工作,而不是来自Apache / PHP.

脚本宝典总结

以上是脚本宝典为你收集整理的macOS Sierra中的更改阻止了“说”在PHP脚本中执行全部内容,希望文章能够帮你解决macOS Sierra中的更改阻止了“说”在PHP脚本中执行所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。