作为一个非常简单的基准测试,我在同一个Raspberry Pi 3模型B上执行了PHP 7.0.19-1和Python 3.5.3(命令行)上面的简单代码.
与PHP相比,Python的执行时间非常糟糕(74秒对1.4秒).任何人都可以帮助我理解为什么执行在Python上需要这么长时间?有什么我做错了,或者一些优化/设置可以提高其性能以达到或超过PHP的性能?或者Python的速度要慢得多(当然不是!)?
是的,我看到了这个基准测试,它报告了PHP 7超越其他语言,但你认为在进行这样一个简单的操作时两者都会得到相当优化.
如果用字符串赋值代替添加,Python执行循环的速度大约快两倍.但这仍然是34秒vs 1.1秒.
PHP7代码:
<?php
function test($x)
{
$t1 = microtime(true);
$a = 0;
for($i = 0; $i < $x; $i++)
{
$a++;
}
$t2 = microtime(true);
echo "Time for $x was " . ($t2 - $t1) . "\n";
return $a;
}
echo test(100000);
echo test(1000000);
echo test(10000000);
Run Code Online (Sandbox Code Playgroud)
结果:100000的时间为0.036377191543579 100000时间1000000为0.18501400947571 1000000时间为10000000为1.3939099311829
Python3代码:
import time
def test(x):
t1 = time.clock()
a = 0
for i in range(x):
a += 1 …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 HTML 页面,它正在导入 JS 模块,如下所示:
.. snip
<button onclick="btnClick()">Go!</button>
<script type="module">
import { func1 } from './utils.js'
function btnClick() {
func1()
}
</script>
Run Code Online (Sandbox Code Playgroud)
单击按钮会产生错误:btnClick() 未定义。
为什么会发生这种情况?如何将这些函数带回到正确的范围内?
我有一个"简单"的问题:如何在PHP脚本中安全地更改用户密码,而不授予Apache root权限或引入其他疯狂的安全漏洞?
背景:CentOS 6,Apache 2.2.13,PHP 5.3.3
我知道pam_chpasswd()命令,它是PECL PAM库的一部分.但是,除非主机进程(httpd)具有对/ etc/shadow文件的读访问权限,否则此函数将失败.(坏想法!如果它需要如此高的权限,不确定这个库如何帮助......)
据我所知,理想的情况是让PHP调用shell脚本,使用'sudo -u [用户更改密码的用户名]'这将运行脚本"AS"用户,所以他应该有权使用改变自己的密码.并且sudo将要求用户发送其现有密码以进行身份验证,从而防止一个用户更改另一个用户的密码.
但是由于某种原因这不起作用......当用popen打开进程时,进程永远不会执行.我将shell脚本设置为将一些文本转储到/ tmp中的公共可写文件中.但它永远不会达到这一点.
$cmd = "/usr/bin/sudo -S -u$username /file_to_execute.sh";
$handle = popen ($cmd, "w"); // Open the process for writing
fwrite ($handle, "$current_password\n"); // Send the user's current password to sudo (-S option)
fwrite .... (write the username, current password, and new password, so the script can change it)
$result = pclose($handle);
Run Code Online (Sandbox Code Playgroud)
如果我访问这个php脚本(http://server/script.php),函数会立即失败,$ result = 1
如果我修改sudoers文件(visudo)并添加一行:
$Defaults:apache!requiretty
该脚本冻结约10秒钟,然后失败($ result = 1)
任何建议,非常感谢!
使用 Node.JS 和cluster模块。
我试图了解多个分叉子进程如何在同一个端口上侦听。
例如,使用cluster模块我们可以这样做:
const port = 443;
...
if (cluster.isMaster) {
for(let i = 0; i < numCPUs; i++)
{
cluster.fork();
}
...
}
else // Forked child processes:
{
...
https.createServer({
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.cert')
}, app)
.listen(port, () => {
console.log(`HTTPS Listening on port ${port}`);
});
}
Run Code Online (Sandbox Code Playgroud)
此代码派生多个进程,所有进程都调用listen同一个端口。我不清楚所有进程如何绑定同一个端口并且仍然能够确定哪个进程获取端口流量。这实际上是一种错觉,而是主进程实际上是唯一一个绑定端口并将请求随机传递给分叉子进程的进程?(如果是这种情况,是不是对性能有影响?)
感谢您帮助我了解所有子进程如何同时侦听同一端口。
请注意,此示例在 Windows 机器上运行,但如果我理解正确,它与 Windows 和 Linux 兼容。
我正在运行共享主机LAMP服务器.我有几个客户使用相同的CMS软件,它使用MySQL作为后端数据库.我得到我的145错误/var/log/mysqld.log有关的mod_statistics.MYI文件:
120713 8:53:22 [错误]/usr/libexec/mysqld:无法打开文件:'mod_statistics.MYI'(错误号:145)
我知道如何解决145错误:这不是问题.但是,找到正确mod_statistics.MYI的问题对我来说是问题,因为此服务器上有很多客户端拥有自己的此表副本.
我的问题:如何修改MySQL日志记录格式以将此文件的完整路径添加到日志输出中?我真的很讨厌必须通过每个客户加载这个表来查看它是否已损坏.
我已经Google搜索并阅读了MySQL日志文件文档,该文档没有讨论更改文件格式.
谢谢!
瑞安
我正在寻找一种方法,允许用户使用标准元素选择文件,并允许浏览器跨页面刷新和/或浏览器实例持续访问该文件。
设想:
我们不想使用 localStorage 来存储整个文件,因为文件的最大大小不受限制,并且可能会超出 localStorage 的大小限制。
我已经部分成功:只要原始浏览器选项卡打开,任何其他浏览器实例或选项卡都可以访问该文件并读取它。但是,如果关闭原始选项卡,本地文件 URL 将被破坏。
这是我完成这部分的方法:
每当另一个浏览器实例/选项卡访问此 URL 时,它都可以使用 XHR 对象和 FileReader 对象加载文件。这是一段代码:
var xhr = new XMLHttpRequest();
console.log("Reading URL: " + localStorage.savedFile);
xhr.open('GET', localStorage.savedFile, true);
xhr.responseType = 'blob';
xhr.onreadystatechange = function(e)
{
if (xhr.readyState == 4)
{
var myBlob = this.response;
console.log(myBlob);
var f = new FileReader();
f.onload = function(e) { console.log(e); alert("Data read: " + e.target.result); };
f.readAsText(myBlob);
}
}; …Run Code Online (Sandbox Code Playgroud) 曾经存在用于检测连接的offline.js,但该项目不再维护。此外,众所周知,浏览器的“navigator.onLine”属性不可靠。
用于主动检测浏览器在线状态的最佳/最新方法是什么,与现代浏览器(包括移动设备浏览器)兼容,可以在在线状态发生变化时引发各种事件?我需要自己写这个,还是重新发明轮子?
请注意,我的用户群中没有人会为了联机/脱机而更改浏览器中的“脱机工作”设置。相反,他们会拔掉网线,断开 wifi 网络,开车到没有信号的地方等等。
我的想法是简单地设置一个超时以重复对我服务器上的 URL 进行 AJAX 调用,并简单地将“在线”变量设置为 true/false 以及根据 AJAX 的错误/成功调用在线/离线回调函数称呼。这是推荐的方式吗?
浏览器:Firefox 58.0.2(64位)
我正在尝试编写一个非常简单的服务工作者来缓存离线模式的内容,遵循此处和此处的指导.
当我第一次加载页面时,服务工作者已正确安装.我可以通过查看:debugging#workers来确认它正在运行.
但是,此时如果我尝试刷新页面(无论是在线还是离线),或导航到站点中的任何其他页面,我会收到以下错误:
在该网站的https:// [我的 URL]经历了一个网络协议违反无法修复.
您尝试查看的页面无法显示,因为检测到数据传输中的错误.
请与网站所有者联系,告知他们这个问题.
控制台显示此错误:
无法加载" https:// [my url]".ServiceWorker将重定向的响应传递给FetchEvent.respondWith(),而RedirectMode不是"跟随".
在Chrome中,我得到了这个:
未捕获(承诺)TypeError:无法在'ServiceWorkerGlobalScope'上执行'fetch':无法构造具有模式为'navigate'的请求和非空RequestInit的请求.
根据这个线程,我将{redirect:"follow"}参数添加到fetch()函数中,但无济于事.
(是的,我在进行更改后从about:debugging页面手动卸载了Service Worker.)
然而,根据我的理解,这是造成问题的反应,而不是取材,对吗?这是因为我的服务器在提供请求的内容时发出重定向?
那么我该如何处理服务工作者的重定向呢?显然会有一些,我仍然想要缓存数据.
我每 1 秒从网络摄像头 RTMP 流中捕获缩略图到 JPG 文件。这是我的命令行:
ffmpeg -i rtsp://192.168.1.89:554/11 -f image2 -r 1 thumb%03d.jpg
Run Code Online (Sandbox Code Playgroud)
如果输入 RTMP 流在给定的超时时间内丢失,如何使 FFMPEG 因错误而死亡?目前,如果我失去与网络摄像头的连接,FFMPEG 就会开始抛出“未知错误”消息,但是当网络重新连接时,ffmpeg 似乎重新连接到流,但不再输出任何捕获的帧。我必须手动终止该进程并重新启动它才能再次开始捕获帧。
当 ffmpeg 在特定的超时时间内失去连接时,让 ffmpeg 死亡会很好。然后我可以监视该过程并在其结束时重新启动。
有任何想法吗?
我正在使用 child_process.spawn() 生成一个进程。如何查看执行的确切命令行(包括传递给 spawn 函数的所有命令行参数)?
这是我不起作用的示例:
var s = require('child_process');
var p = s.spawn('ffmpeg', ['-probesize 1024', '-i "rtsp://192.168.1.10:554/11"', 'test.h264']);
Run Code Online (Sandbox Code Playgroud)
当我捕获标准错误时,我收到一条消息“无法识别的选项 'probesize 1024'。但是,如果我从命令行运行 ffmpeg,它工作正常。所以我需要在被修改之前确切地查看命令行选项是如何被破坏的发送到 FFMPEG 以进行调试。
谢谢