如何将字符串从 php 传递给 tcl 并执行脚本

How to pass the string from php to tcl and execute the script

我想从我的 php 传递字符串,例如

<?php
str1="string to pass"
#not sure about passthru
?>

还有我的 tcl 脚本

set new [exec $str1]#str1 from php
puts $new

这可能吗?请让我知道我受困于此

有可能。

test.php

<?php
$str1="Whosebug!!!";
$cmd = "tclsh mycode.tcl $str1";
$output = shell_exec($cmd);
echo $output;
?>

mycode.tcl

set command_line_arg [lindex $argv 0]
puts $command_line_arg 

最简单的机制是 运行 Tcl 脚本作为一个子进程,运行 是一个接收脚本(您可能将其放在与 PHP 代码相同的目录中,或放在其他位置)解码传递的参数,并根据您的要求进行处理。

所以,在 PHP 方面你可能会这样做(注意 重要 在这里使用 escapeshellarg!我建议使用带空格的字符串作为测试您的代码是否正确引用的情况):

<?php
$str1 = "Stack Overflow!!!";
$cmd = "tclsh mycode.tcl " . escapeshellarg($str1);
$output = shell_exec($cmd);
echo $output;
echo $output;
?>

在 Tcl 方面,参数( 脚本名称之后)被放入全局 argv 变量的列表中。该脚本可以通过任意数量的列表操作将它们拉出。这是一种方法,使用 lindex:

set msg [lindex $argv 0]
# do something with the value from the argument
puts "Hello to '$msg' from a Tcl script running inside PHP."

另一种方法是使用 lassign:

lassign $argv msg
puts "Hello to '$msg' from a Tcl script running inside PHP."

但是请注意(如果您正在使用 Tcl 的 exec 调用子程序)Tcl 会有效地自动为您引用参数。 (实际上,出于技术原因,它确实在 Windows 上这样做了。)Tcl 不需要像 escapeshellarg 这样的东西,因为它将参数作为字符串序列,而不是单个字符串,因此对什么了解更多正在进行中。


传递值的其他选项是通过环境变量、管道、文件内容和套接字。 (或者通过一些更奇特的东西。)inter-process 通信的一般主题在两种语言中都可能变得非常复杂,并且涉及很多 trade-offs;你需要非常确定你要做什么才能明智地选择一个选项。