Как передать строку из php в tcl и выполнить скрипт

Я хочу передать строку из моего PHP как

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

И мой tcl скрипт

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

Это возможно? Пожалуйста, дайте мне знать, что я застрял с этим

2

Решение

Самый простой механизм — запустить скрипт 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 потому что он принимает аргументы в виде последовательности строк, а не одной строки, и поэтому знает больше о том, что происходит.


Другие варианты передачи значений — по переменным среды, по конвейеру, по содержимому файла и по сокету. (Или с помощью чего-то более экзотического.) Общая тема межпроцессного взаимодействия может быть очень сложной на обоих языках, и в этом участвует очень много компромиссов; вам нужно быть очень уверенным в том, что вы пытаетесь сделать в целом, чтобы правильно выбрать вариант.

1

Другие решения

Это возможно.

test.php

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

mycode.tcl

set command_line_arg [lindex $argv 0]
puts $command_line_arg
1

По вопросам рекламы [email protected]