我有一个PHP文件,该文件使用exec()运行节点脚本以收集输出,如下所示:
$test = exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/");
echo $test;
它在--url参数中输出绑定到网站的JSON数据字符串。效果很好,但有时输出字符串会被缩短。
当我直接在exec()脚本中运行命令时,我得到了预期的完整输出。
为什么会这样?我也尝试过运行shell_exec(),但是在输出缩短时也会发生同样的事情。
php.ini或其他地方是否有设置来增加输出字符串的大小?
答案 0 :(得分:1)
似乎唯一可行的方法是将exec()
传递到临时文件,如下所示:
exec("/usr/local/bin/node /home/user/www/bin/start.js --url=https://www.example.com/ > /home/user/www/uploads/json.txt");
$json = file_get_contents('/home/user/www/uploads/json.txt');
echo $json;
我希望直接输出,并尝试在php.ini中不加更改地增加output_buffering
(输出仍然被切断)。
绝对可以避免使用临时文件,但也可以使用该文件,每次运行仅unlink()
个文件即可。
答案 1 :(得分:0)
#ifndef PDS_CPP_BUFFER_H
#define PDS_CPP_BUFFER_H
#include <queue>
#include <mutex>
#include <condition_variable>
template <class T>
class Buffer {
private:
std::queue<T> queue;
std::mutex mutex;
std::condition_variable cv;
std::chrono::seconds sec;
public:
Buffer(int time) : sec(time), queue() {};
void push(T object) {
std::lock_guard lockGuard(mutex);
this->queue.push(object);
this->cv.notify_one();
}
T pop() {
std::unique_lock uniqueLock(mutex);
// this->cv.wait(uniqueLock, [this]{ return !this->queue.empty(); });
if(this->cv.wait_for(uniqueLock, this->sec, [this]{ return !this->queue.empty(); })) {
} else {
std::stringstream msg;
msg << std::this_thread::get_id() << " timeout" << std::endl;
std::cout << msg.str();
}
T object = this->queue.front();
this->queue.pop();
uniqueLock.unlock();
return object;
}
};
#endif //PDS_CPP_BUFFER_H
仅返回传递给它的命令输出的最后一行。根据以下文档的标为“返回值”的部分:
命令结果的最后一行。如果需要执行命令并将命令中的所有数据直接传递回去而没有任何干扰,请使用passthru()函数。
要获取已执行命令的输出,请确保设置并使用输出参数。
要做您想做的事情,您需要向函数传递一个数组来存储输出,如下所示:
exec()