在previous post中,我试图从php更新下载文件的编码。其中一个建议是在将文件发送给用户之前运行unix2dos命令。当我在linux机器上运行命令时,这很有效,但是当我尝试从php运行命令时,我什么也得不到。这是我试过的:
$cmd = "unix2dos -n $fullPath $downloadFile";
echo exec($cmd, $out, $retVal);
这对屏幕不显示任何内容,$ retVal为0,$ out为空字符串。
echo system($cmd, $retVal);
这对屏幕不显示任何内容,$ retVal为0。
echo shell_exec($cmd);
这对屏幕不显示任何内容。
我也试过转义命令及其参数如:
$cmd = escapeshellcmd($cmd);
和
$cmd = "unix2dos ". escapeshellarg("-n \"$fullPath\" \"$downloadFile\"");
如果你看到我做错了什么,请告诉我。
谢谢!
修改:以下是一些可能有用的信息。 unix2dos版本:2.2(1995.03.31) php版本5.2.9 在Redhat Enterprise Linux 4中运行apache 2
答案 0 :(得分:2)
您是否考虑过纯PHP解决方案?
<?php
$unixfile = file_get_content('/location/of/file/');
$dosfile= str_replace("\n", "\r\n", $unixfile );
file_put_contents('/location/of/file/', $dosfile);
?>
这样的东西应该这样做,虽然未经测试:)
沙迪
答案 1 :(得分:1)
查看PHP exec命令运行的用户:
<?php system('whoami'); ?>
如果此命令失败,那么您可能没有权限使用exec()或system(),因此请检查您的INI文件。但一定要检查正确的!在Debian系统上,分别存储在/etc/php5/apache/php.ini和/etc/php5/cli/php.ini中的单独的Apache和CLI INI文件。对不起,我不知道RedHat的位置。
如果 whoami 命令成功,请确保显示的用户可以运行 unix2dos 命令,并且允许同一用户进行更改有问题的文件使用chmod或chown。
答案 2 :(得分:0)
您使用unix2dos
的完整路径吗?也许可执行文件位于shell的路径中,但不在PHP正在使用的路径中。
答案 3 :(得分:0)
我对unix2dos的实现不会产生任何输出。如果返回值为0,则命令成功,文件已更新。
我看到的唯一另一件事是我的版本似乎没有的-n选项。您应该检查您的手册页以查看它支持的选项
答案 4 :(得分:0)
unix2dos不显示它转换的文件。因此,您必须自己展示它。一个非常基本的方法可能是:
$cmd = "unix2dos -n $fullPath $downloadFile";
echo exec($cmd, $out, $retVal);
include "$fullPath."/".$downloadFile;
使用include非常脏但又快捷。更简洁的方法是使用fopen并读取文件然后显示它。
你最好创建一个包含所有操作的函数:转换+显示,这样你就可以掌握一切。
但是,如果我是你,我宁愿不使用exec并使用FileIterator在每一行都有一个修剪,这样你就不必关心回车了,也不用处理危险的shell绑定。
答案 5 :(得分:0)
不确定您的确切问题,但调试建议:
首先尝试将$ cmd设置为ls
。看看是否有效。然后尝试使用/bin/ls
(使用完整路径。)
如果这些不起作用,那么PHP配置可能存在问题 - 可能存在safemode参数或者不允许使用exec(),shell_exec()或system()函数。
答案 6 :(得分:0)
我从这里获得了源代码。
http://www.sfr-fresh.com/linux/misc/unix2dos-2.2.src.tar.gz
我编译了它,然后运行了该工具。这是我的输出:
rascher@danish:~/unix2dos$ ./a.out -n 1.txt 2.txt
unix2dos: converting file 1.txt to file 2.txt in DOS format ...
我认为问题在于:程序将其所有输出写入stderr
,而不是stdout
。如果查看源代码,可以看到“fprintf(stderr,...)”
据我所知,PHP只会读取发送到STDOUT的程序输出部分。因此,为了克服这个问题,您似乎必须将程序的输出(unix2dos使用stderr)重定向到stdout。要做到这一点,尝试类似:
$cmd = "unix2dos -n $fullPath $downloadFile 2>&1"
“2&gt;”表示“重定向stderr”,“&amp; 1”表示“to stdout”。
在任何一种情况下,我都会想象文件正在正确转换,但由于你没有得到任何预期的输出,你认为它失败了。在进行更改之前,请检查输出文件以查看它是DOS格式还是UNIX格式。