如何通过PHP触发已注册的Windows自定义协议处理程序以启动目标应用?
兄弟,我来给你唠唠怎么用PHP触发你那个已经注册好的Windows自定义协议,启动你的VideoPlugin应用哈。首先得确认你的PHP是跑在本地Windows的Web服务器上的(比如XAMPP、WAMP这类),毕竟要触发本地应用,远程PHP肯定管不着你本地Windows的事儿。
直接用PHP的执行函数调用Windows命令
你已经通过Win+R验证了自定义协议videoplugin://能正常启动应用,那在PHP里可以用exec或者shell_exec调用Windows的start命令来触发这个协议。比如直接写:exec('start "" "videoplugin://IP:100.100.210.16;Port:90;UserName:adm"');这里
start后面的空引号是为了兼容可能带空格的路径或协议参数,就算你现在的参数里没空格,加上也更稳妥。或者用shell_exec也能达到同样效果:$output = shell_exec('start "" "videoplugin://IP:100.100.210.16;Port:90;UserName:adm"');注意Web服务的权限坑(这是最容易踩的!)
很多时候本地跑PHP用的Apache、IIS这类Web服务,默认是用系统账户(比如Local System)运行的,这个账户没有权限访问你当前登录用户的交互桌面,就算你代码写对了,应用也可能在后台跑但看不到界面。这时候得把Web服务的运行账户改成你当前登录的Windows用户:- 比如用XAMPP的话:打开XAMPP的服务管理器,找到Apache服务右键属性,切换到「登录」选项卡,选择「此账户」,输入你当前Windows的用户名和密码,然后重启Apache服务。
- 用IIS的话:打开IIS管理器,找到你站点对应的应用池,右键选「高级设置」,在「进程模型」里把「标识」改成你的Windows用户账户,重启应用池就行。
先手动验证命令再写进PHP
怕出问题的话,先在Windows的命令提示符(CMD)里手动运行start "" "videoplugin://IP:100.100.210.16;Port:90;UserName:adm",确认能正常启动应用,再把这段命令复制到PHP里,这样能排除命令本身的问题。用proc_open调试(可选)
如果exec没反应,想看看有没有错误信息,可以用proc_open函数,它能获取执行过程中的输出和错误,方便排查问题:$descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("pipe", "w") ); $process = proc_open('start "" "videoplugin://IP:100.100.210.16;Port:90;UserName:adm"', $descriptorspec, $pipes, null, null); if (is_resource($process)) { $errors = stream_get_contents($pipes[2]); fclose($pipes[0]); fclose($pipes[1]); fclose($pipes[2]); proc_close($process); // 打印错误信息排查问题 var_dump($errors); }
备注:内容来源于stack exchange,提问作者Dev Chris




