问题标签 [k2f]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1512 浏览

php - PHP proc_open 多次打开

我有一个实用程序函数,用于通过 CLI(cmd、bash 等)执行程序。它返回一个包含 3 个项目的数组STDOUTSTDERREXIT CODE

到目前为止,它运行良好,没有任何问题。事实上,我遇到的问题并没有真正阻碍它的功能,但我担心性能。

问题是在某些情况下,PHP 多次运行相同的命令(在我的情况下为 3 次),即使它应该只执行一次。

注意注释行(第 9 行)。那是为了测试。我启用它以确保目标程序只运行一次(我在想我的代码可能会以某种方式调用相同的函数)。但即使启用了该行,该程序仍会运行多次。

事实上,我的代码中有两个地方正在执行相同的程序(在不同的场合)。它们的命令行是相同的。

但是,有一次,程序运行一次,而在这种情况下,PHP 运行了 3 次。

我一直在 Process Explorer 下监视并查看此行为。我正在使用 Windows 7 x64。该程序是 32 位的,PHP 也是如此。

编辑:有问题的程序是定制开发的,它不会打开新流程。

0 投票
3 回答
2316 浏览

php - PHP 奇怪的 DOCUMENT_ROOT

所以基本上,我正在编写一个框架,作为它功能的一部分,它应该为最终开发人员提供一组完善的 URI/路径。

其中一些路径使用$_SERVER['DOCUMENT_ROOT']

该代码已经过微调,可以在 Linux 和 Windows 上运行。显然,它大部分时间都在 Linux 上运行,实际上在 VPS 上非常无缝。

但是,最近,我在HG 经销商帐户(共享主机)上尝试了它,但一切都破裂了。我在有问题的机器上打印出 $_SERVER 内的数据:

还有我的机器:

** 您应该阅读的部分,应该可以完美地解释我的问题。

所以基本上,预期DOCUMENT_ROOT/home/sitename/public_html/,但我得到了/usr/local/apache/htdocs

哦,对不起,如果我有点太冗长了;)

编辑:

getcwd()=>/home/visitgoz/public_html

__FILE__=>/home/visitgoz/public_html/K2F/config.php

0 投票
4 回答
335 浏览

php - 使用 eval() 增强安全性

我承认标题主要是第 22 条,但它是完全相关的,所以请耐心等待我...

背景

有些人可能知道,我正在开发一个 PHP 框架,其主要卖点是在不同 CMS/系统之间桥接功能。从开发人员的角度来看,有一个广泛的错误处理和日志记录机制。现在,有两个设置DEBUG_MODEDEBUG_VERBOSE,它们控制调试输出。

模式描述了中等,详细控制了细节的数量。简而言之,有一种称为“控制台”的模式,它基本上将调试信息转储到 javascript 控制台(现在可以在您附近的主要 Web 浏览器中使用)。

问题

这个 [调试系统] 非常适合开发服务器,但您绝对不能在生产服务器上使用它,因为调试详细信息(包括数据库凭据等)会公开发布。老实说,谁曾经从开发者那里迁移过来。到一个刺激。服务器每次都完美无瑕?

解决方案

因此,我一直在想办法解决这个问题。我提出的解决方案包括:

  • 有一个设置告诉框架仅当请求来自某个 IP 时才启用日志记录。这样做的安全问题非常明显(IP 欺骗等)。
  • 有一个包含 PHP 表达式(代码)的设置,该表达式(代码)被 eval'd 并且它的返回用作是/否。最好的部分是安装的框架可能会建议特定于 CMS 的表达式,例如:
    • WordPress:current_user_can('manage_options')
    • Joomla:$user=&JFactory::getUser() && ($user->usertype=='Super Administrator') || ($user->usertype=='Administrator')
    • 风俗:$_SERVER['REMOTE_ADDR']=='123.124.125.126'
  • 这些是两者之间的,我渴望听到更多的建议。

那么,你认为eval()应该这样做吗?我将通过每个页面加载/请求只执行一次来确保它仍然运行良好。

澄清

$USER_CONDITON允许诸如运行之类的东西is_admin()以允许所有管理员查看调试信息,或者getUser()->id==45为特定用户启用它。或通过IP,或其他任何方式。

在此处输入图像描述

0 投票
4 回答
9801 浏览

php - 在 PHP 中正确执行 shell

问题

我正在使用一个proc_open()用于调用 shell 命令的函数。看来我做 STDIO 的方式是错误的,有时会导致 PHP 或目标命令锁定。这是原始代码:

大部分时间都有效,但这还不够,我想让它一直有效。

如果 STDIO 缓冲区超过 4k 的数据,问题就在于stream_get_contents()锁定。

测试用例

我们两次向 STDERR 和 STDOUT 输出一个字符串,总长度为 4120 字节(超过 4k)。这会导致 PHP 在两边都锁定。

解决方案

显然,stream_select()是要走的路。我有以下代码:

剩下的唯一一块拼图是处理 STDIN(见标有 的行(???))。 我发现 STDIN 必须由调用我的函数的任何东西提供,execute(). 但是如果我根本不想使用 STDIN 怎么办?在上面的测试用例中,我没有要求输入,但我应该对 STDIN 做点什么。

也就是说,上述方法仍然冻结stream_get_contents(). 我很不确定下一步该做什么/尝试。

学分

Jakob Truelsen 提出了解决方案,并发现了原始问题。4k 小费也是他的主意。在此之前,我对为什么该函数工作正常感到困惑(不知道这完全取决于缓冲区大小)。