向由 proc_open() 打开的进程发送信号
我们在这里有一个实用程序,该实用程序正在使用proc_open()调用SSH在远程计算机上运行命令.但是,在某些情况下,我们需要在远程计算机上停止命令,但是proc_close()和proc_terminate()不会导致所需的信号发送到SSH连接的远端. SSH通常会在终止程序时向运行程序发布SIGHUP,但是我们需要将SIGINT发送到SSH,该程序将其转发到在远程端运行的程序中. 我已经尽可能多地搜索过,并且似乎有许多pcntl函数用于接收信号,但是我找不到有关发送的任何东西通过PHP信号,更不用说与proc_*函数有关的任何东西. 解决方案 您可以通过PHP发送信号: posix_kill(posix_getpid(), SIGTERM);
28 2024-04-22
编程技术问答社区
PHP: 在中间服务器上实时压缩文件流,而不存储(太多的)数据
相关: 使用php 流式传输大文件 我正在寻找其他主题中描述的方法的组合.我可能需要在小块中读取该文件(从URL) ,将这些文件输送到proc_open zip命令的stdin中,抓住输出并将其冲洗到客户端. 我需要做的事情: 从存储服务器读取来自URL的文件流 在网络服务器上飞行 使用未知大小的内容插曲将其作为下载到Web浏览器(毕竟是流). 我不能做的事情: 将文件存储在网络服务器上 在存储服务器上运行代码 使用很多内存 让客户等待下载 因此,在进行远程块阅读时,需要启动数据的冲​​洗. 这在PHP中可以吗?我觉得这在提供更多回调/异步功能的语言中要容易得多,但是在这种情况下我一直陷入PHP. 任何示例或一些粗糙的代码都将非常欢迎! 解决方案 不是PHP,但是这个项目正是您想要的.您可以将其作为独立服务器托管,并从PHP调用它: https://github.com/scosman/sipsman/zip
2 2023-12-26
编程技术问答社区
php proc_open不起作用 - 给我"丢失的浪费限定符"
警告:proc_open():c:\ ... \ updateDots.php in Line 102 中的数组中缺少句柄限定符 我试图在2秒钟后打开记事本.这是我的代码: $descriptorspec = array( 0 => array("pipe" => "r"), 1 => array("pipe" => "w"), 2 => array("file" => "logs/errors.txt") ); // Create child and start process $child = array("process" => null, "pipes" => array()); $child["process"] = proc_open("notepad.exe > nul 2>&1", $descriptorspec, $child["pipes"]); 知道这个错误是什么意思,什么原因导致了? 解决方案 不是0 => arra
8 2023-12-17
编程技术问答社区
Proc_open和Capifony问题
我正在尝试将Capifony与Symfony2.1中的Web应用程序一起使用,以加速部署过程. 这是我的deploy.rb文件: default_run_options[:pty] = true set :application, "mywebsite" set :domain, "mywebsite.com" set :deploy_to, "~/git/mywebsite.git" set :app_path, "app" set :repository, "git@github.com:myname/mywebsite.git" set :scm, :git # Or: `accurev`, `bzr`, `cvs`, `darcs`, `subversion`, `mercurial`, `perforce`, or `none` set :user, "myserveruser" # The server's user fo
14 2023-10-12
编程技术问答社区
在php中连接进程的管道
我希望将一个用proc_open创建的一个过程的输出输出到使用proc_open(in PHP)创建的另一个过程.例如.在bash中,我可以做: [herbert@thdev1 ~]$ cat foo 2 3 1 [herbert@thdev1 ~]$ cat foo | sort 1 2 3 [herbert@thdev1 ~]$ 我想使用proc_open(而不是shell_exec)在php中模拟这一点,以便控制返回编码,管道等.所以我想要这样的东西: $catPipes=array(); $sortPipes=array(); $cwd = '/tmp'; $env = array(); $catProcess = proc_open("cat foo", array( 0 => array("pipe", "r"), 1 => array("pipe", "w") ), $catPipes, $cwd, $env);
30 2023-09-30
编程技术问答社区
带有proc_open()的多个输入
我目前正在从事一个在线程序.我正在编写一个PHP脚本,该脚本使用proc_open()(在linux ubuntu下)在命令行中执行命令.到目前为止,这是我的代码: array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w"), ); $process = proc_open($cmd, $descriptorspec, $pipes); if (is_resource($process)) { fwrite($pipes[0], "4"); fwrite($pipes[0], "5"); fclose($pipes[0]); while($pdf_content = fgets($pipes[1])) { echo
8 2023-09-29
编程技术问答社区
进程_开放互动
这是我要实现的目标:打开外壳(korn或bash,没关系),我想打开一个SSH连接(ssh user@host).在某个时候,很可能会出现密码的提示,或者我可能会问我是否确定我要连接(不利的密钥). 在任何人问之前:是的,我知道有一个用于SSH2 Exec的插件,但是我正在使用的服务器不支持它,并且不太可能这样做. 这是我到目前为止尝试的: $desc = array(array('pipe','r'),array('pipe','w'));//used in all example code $p = proc_open('ssh user@host',$desc,$pipes); if(!is_resource($p)){ die('@!#$%');}//will omit this line from now on sleep(1);//omitting this,too but it's there every time I need it 然后,我尝试读取
18 2023-09-26
编程技术问答社区
按PID获取进程资源
我想编写Web SSH控制台,我发现了两个问题. 我想做的.首先,我要执行具有以下代码的文件. $process = proc_open('start', array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "a") ), $pipes); 第二我要运行command.php在start.php文件中创建的进程上运行命令并从中获取结果. $pid = 12345; print_r(process_command('ping google.com', $pid)); 我只想访问过去创建的过程(cmd),将命令发送到它并获得结果. 如果我可以为每个command.php创建新的过程,为什么这是问题?因为新过程是新会话,所以如果我在过去的command.php执行中登录mySQL,则在下一个执行中,我必须再次登录mySQL,因为新过程不
26 2023-09-06
编程技术问答社区
PHP-杀死不同文件上的proc_open()进程?
我正在使用proc_open()创建背景过程,并且想知道如何从其他文件或操作中取消或停止此背景过程,而我的背景过程仍在运行? 这是我的代码: $errorLog = './error.log'; $descriptorspec = array( 0 => array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("file", $errorLog, "a") // stderr is a file to write to ); proc_open("/var/bin/php /home/hello/myscript.php &", $descriptorspec, $pipes); 我已经阅读了pr
28 2023-07-01
编程技术问答社区
环境没有传递给由proc_open打开的进程
我有一个问题,将环境变量传递给了我使用proc_open打开的流程. 我在 http://us2.php.net/manual上找到了以下示例./en/function.proc-open.php array("pipe", "r"), // stdin is a pipe that the child will read from 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to ); $cwd = '/tmp'; $env = array('some_option' => 'aeiou'); $process = proc_o
28 2023-07-01
编程技术问答社区
在Windows服务器上运行PHP脚本中的perl文件但不等待输出
我试图从PHP脚本中执行Perl脚本.我已经使用了exec,popen和proc_open等各种方法进行此操作,但是我有几个问题要解决,旧的Google没有给我答案. 我需要从php文件中运行.pl脚本(将一个变量传递给脚本) -5小时在服务器上运行).我不会期望从Perl脚本(Perl脚本将其输出记录到MySQL db)中的任何回报输出),因此我只需要在服务器上运行并让PHP脚本运行. 在运行Apache,php,mysql的Windows机器上运行时,有一些障碍. 我认为我看到了Linux的解决方案,但需要留在Windows机器上. im当前尝试使用以下代码尝试proc_open方法(proc_open行上的35是我需要传递给perl脚本的测试ID): $descriptorspec = array( 0 => array("pipe","r"), 1 => array("pipe","w"), 2 => array("file","./error.lo
6 2023-06-30
编程技术问答社区
proc_open: 扩展文件描述符的编号,以便从Perl脚本中获得 "状态 "反馈
php的 proc_open 手动状态: 文件描述符编号不限于0、1和2-您可以指定任何有效的文件描述符编号,并将其传递给子进程.这使您的脚本可以与其他作为"共同处理"运行的脚本互操作.特别是,这对于以更安全的方式传递给PGP,GPG和OpenSSL等程序很有用.它对于读取这些程序在辅助文件描述符上提供的状态信息也很有用. 发生了什么:我在基于PHP的Web应用程序中称为Perl脚本并在呼叫中传递参数.我将来不需要将数据发送到脚本.通过stdout [1],我从perl脚本json_encoded数据中收到了我在PHP应用程序中使用的数据. 我想添加的内容: perl脚本正在通过网站进行,根据其初始调用中传递的参数收集信息.我想将我可以用作作为进度栏的文本字符串发送回PHP应用程序. 我认为我应该如何做:我希望(每1-2秒)对该"进步"更新设置的频道进行调查.我将使用JavaScript/jQuery写入HTML Div容器中,以供用户查看.我认为我不应该将"进度
16 2023-06-30
编程技术问答社区
如何使用PHP来设置一个交互式的SSH会话?
我正在尝试通过Mac OS X 10.6上的命令行使用PHP建立与远程服务器的交互式SSH连接.我目前正在使用PHP的proc_open函数执行以下命令: ssh -t -t -p 22 user@server.com 这几乎有效. -t -t选项应该迫使他们几乎拥有的伪码头.我可以输入SSH密码,然后按Enter.但是,按下进入终端后似乎只是悬挂.没有输出,没有什么都没有 - 好像SSH会话失败了.我无法运行命令或其他任何东西,必须使用CTRL+C杀死整个过程.我知道登录成功,因为我可以执行ssh -t -t -p 22 user@server.com "ls -la"之类的命令并获取正确的输出. 我认为问题必须与我在proc_open呼叫中使用标准管的事实有关,因此我用PTY替换了它们.我收到以下错误:"此系统不支持Pty Pseudo终端..." Mac OS X根本不支持PTY或伪终端? (我很熟悉使用所有这些外壳术语). 这是PHP代码: $d
32 2023-06-29
编程技术问答社区
没有得到POPEN的全部回应
嗨,我正在与popen一起运行一个过程; - $handle = popen('python scriptos.py', "r"); while (!feof($handle)) { $data = fgets($handle); echo "> ".$data; } ,我只从返回5行的过程中获得3行.我在CLI中运行此确切的命令,我会得到更多回复.好像它停止阅读(在工作时可能需要花费时间来完成并更新下2行,这是一个进度指标). ). 我做错了吗?是 proc_open 更合适(我已经开始尝试是否可以尝试). 解决方案 两条缺失的线可能被写入 stderr >仅返回用于Stdout的指针. 您可以使用 proc_open() 来获取用于stderr的指针C0> 线 $handle = popen('python scriptos.py 2>&1', "r"); 将stderr重定向到Stdout,因此将其包含在您的输出中.
32 2023-06-10
编程技术问答社区
用proc_open()加载.profile
以下情况是:我写了一个在某个服务器上运行的后端应用程序.在此服务器上,有一个可以从ssh从前端服务器执行的脚本.然后,我的脚本将检查它是否正确加载的环境变量,因为我在脚本本身中严重依赖它们. 这有效,尽管不是我希望事情起作用的方式.当然,随着连接的建立,./Profile不会加载exec('source /home/user/.profile');当然不起作用.由于脚本已经在运行. 这就是脚本这样启动的原因: #!/to/php/bin/php -n
38 2023-06-07
编程技术问答社区
让PHP proc_open()读取一个PhantomJS流,只要png被创建就可以。
我有一个依赖shell_exec()的PHP脚本,并且(结果)有99%的时间工作. 该脚本执行了产生图像文件的phantomjs脚本. 然后使用更多的PHP以某种方式处理该图像文件. 问题是,有时shell_exec()会悬挂并引起可用性问题. 阅读此 https://github.com/ariya/phantomjs/sissues/11463 我了解到shell_exec()是问题,而切换到proc_open可以解决悬挂. 问题是,shell_exec()等待执行的命令完成proc_open未能完成,因此随着它的遵循并在生成的图像上使用的PHP命令随着图像仍在产生而作用. 我在Windows上工作,所以pcntl_waitpid不是一个选择. 我要做的是连续地让phantomjs输出某些内容(任何东西),以便proc_open可以通过其stdin管道读取,这样我就可以计时图像处理PHP功能在目标图像的情况下尽快开始工作文件准备就绪. 这是我的phantomjs脚本
30 2023-06-02
编程技术问答社区
PHP:试图让fgets()在CRLF、CR和LF上都能触发。
我正在使用proc_open和fgets($ stdout)阅读php中的流,试图在进入时获取每一行. 许多Linux程序(软件包管理器,WGET,RSYNC)只需使用CR(马车返回)字符来定期更新"到位",例如下载进度.我想在发生这些更新(作为单独的行)时. 目前,fgets($ stdout)一直在读取直到LF,因此当进度进展非常缓慢(例如,大文件)时,它只是继续阅读直到完全完成,然后将所有更新的行返回为一个长字符串,包括 crs. 我已经尝试设置" Mac"选项将CRS检测为线路结尾: ini_set('auto_detect_line_endings',true); 但这似乎不起作用. 现在,stream_get_line将允许我将CRS设置为线路断裂,而不是将CRLF,CR和LF视为定界器的"捕获"解决方案. 我当然可以阅读整个行,使用各种PHP方法将其拆分,然后用LFS替换所有类型的线路破解,但这是一个流,我希望PHP能够在仍在运行时
48 2023-05-31
编程技术问答社区
在PHP中正确执行shell
问题 i使用的函数可以使用proc_open()调用shell命令.看来我做stdio的方式是错误的,有时会导致PHP或目标命令锁定.这是原始代码: function execute($cmd, $stdin=null){ $proc=proc_open($cmd,array(0=>array('pipe','r'),1=>array('pipe','w'),2=>array('pipe','w')),$pipes); fwrite($pipes[0],$stdin); fclose($pipes[0]); $stdout=stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr=stream_get_contents($pipes[2]); fclose($pipes[2]); return array( 'stdout'=>$stdout,
38 2023-05-30
编程技术问答社区
如何获得proc_open()的输出?
我尝试从php中的proc_open方法获取输出,但是,当我打印时,我空了. $descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("file", "files/temp/error-output.txt", "a") ); $process = proc_open("time ./a a.out", $descriptorspec, $pipes, $cwd); ,只要我知道,我就可以使用stream_get_contents() 获得输出 echo stream_get_contents($pipes[1]); fclose($pipes[1]); 但我不能那样做. 有任何建议吗? thx ... 解决方案 您的代码或多或少对我有用. time将其输出打印到stderr,因此,如果您正在寻找该输出,请查看文件f
78 2023-05-28
编程技术问答社区
PHP使用proc_open,这样它就不会等待它打开(运行)的脚本完成?
我已经花了一段时间了,但是无法实现这一点,我深表歉意,因为我提出了一个与此相关的问题,但删除了它,因此我可以做更多的研究来缩小问题,此时我被困在我以为我对此有解决方案时所困扰,但它无法正常工作..我找到了一个论坛,有人问了一个类似的问题,他们给了下面的代码,我正在尝试.它确实运行了脚本,但是它仍然等待它完成,然后再进入PHP代码 的下一行 proc_close(proc_open ("/var/www/other_scripts/perl/apps/emails_extract_from_url.pl \"$stoopid\"", array(), $foo)); 解决方案 当我玩proc_open时,我的一些代码 我有proc_close(10到30秒)的问题,所以我刚刚使用Linux Command Kill杀死了该过程 $options=array(); $option['sleep-after-destroy']=0; $option['sleep-
40 2023-03-22
编程技术问答社区