javascript - 在php中重复运行外部程序
问题描述
我想在 Web 服务器中重复运行一个用 c++ 编写的程序。因为有些事情是php做不到的,而c++却可以轻松做到。
我搜索了一下,发现可以通过使用exec
php中的函数来完成。
我在 jssetInterval
中使用它每 100 毫秒运行一次该程序。但似乎该程序在网页加载时运行,并且在 js 代码中,我有相同的输出。
例如,当我想从 c++ 程序中获取当前日期时。cpp代码是:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
time_t now = time(0);
tm *ltm = localtime(&now);
cout << 1 + ltm->tm_sec;
return 0;
}
在index.php
文件中,我使用它每 100 毫秒在页面上打印当前秒数。
<script>
setInterval(function(){
var date = "<?php passthru("print_date.exe"); ?>";
document.write(date + "<br>");
},100);
</script>
但它的打印总是一样的!
有没有其他方法可以做到这一点?谢谢!
解决方案
因为 php 代码只执行了 1 次。使用 Ajax 作为选项。
//第二天更新。1. 文件(index.php)
<script>
var aj;
setInterval(function()
{
aj = new XMLHttpRequest();
aj.open('GET',"/print_date.php",false);
aj.onreadystatechange = processData;
aj.send(null);
},1000);
function processData()
{
var date = '';
if (aj.readyState == 4)
{
date = aj.responseText;
document.write(date + "<br>")
}
}
</script>
这是非常简单的同步ajax。间隔是 1000,而不是 100,因为 1000ms = 1s(C++ 程序以秒为单位返回时间!)。
2)所以, print_date.php 是
<?php
error_reporting(0); //because any warning destroys output for ajax
passthru("print_date.exe");
推荐阅读
- aws-lambda - CloudFront 的 Terraform lambda_function_association 作为模块中的可选列表
- html - Chrome 浏览器更新后 CSS 无法正常工作
- c# - 使用 Async Task Main 从 ac# 类库访问 .ToList()
- orbeon - xforms HTTP 404 在 textarea.min.js.map 和 orbeon-form-runner-opt.js.map
- reactjs - StandardJS 和 React 类导出 Unexpected token =
- rest - RESTful API 执行的成功 PUT 操作返回的正确状态代码是什么?
- php - 对于 HTML 中的下拉菜单,键入值不能按预期工作?
- office-js - 如何在 Office `Dialog API` 中使用`Word.run(function (context) {`
- laravel - 复选框不保存真实值
- bash - 检查 SeLinux 状态