gpt4 book ai didi

php fwrite() 没有完成将字符串数据写入文件,为什么?

转载 作者:可可西里 更新时间:2023-11-01 12:55:57 27 4
gpt4 key购买 nike

我正在尝试将大量数据写入通过 php 中的 fopen() 打开的文件。我使用的协议(protocol)包装器是 ftp,因此该文件对于运行 php 代码的服务器来说是远程的。我要写入的文件位于 Windows 服务器上。

我证实该文件确实是由我的 php 代码创建的,但问题是文件中的数据不存在 (0KB) 或写入文件过早停止。不知道为什么会这样。

这是我用来处理操作的代码:

$file_handle = fopen($node['ftp'].$path_to_lut, "wb", 0, $node['ftp_context']);
include_once($file);

if ($file_handle)
{
fwrite($file_handle, $string); //$string is inside included $file
fclose($file_handle);
} else {
die('There was a problem opening the file.');
}

当我将它托管在我的本地机器上时,这段代码工作正常,但是当我将它上传到我的网络主机 (Rackspace Cloud) 时,它失败了。这让我相信这是一个与我在 Rackspace 的服务器配置相关的问题,但我想知道我是否可以对我的 php 代码做些什么来使其更健壮。

有什么想法可以确保 fwrite 真正完成将字符串写入远程机器?

谢谢!

好吧,我把写入文件的代码改成了这样:

if ($file_handle)
{
if ($bytesWritten = fwrite($file_handle, $string) ) {
echo "There were " . $bytesWritten . " bytes written to the text file.";
}

if (!fflush($file_handle)) {
die("There was a problem outputting all the data to the text file.");
}

if (!fclose($file_handle)) {
die("There was a problem closing the text file.");
}

} else {

die("No file to write data to. Sorry.");

}

奇怪的是回显语句显示如下:

There were 10330 bytes written to the text file.

然而,当我通过 FTP 验证文本文件大小时,它显示它为 0K,并且文件中的数据实际上被截断了。我无法想象它与 FTP 服务器本身有关,因为如果 PHP 托管在 Rackspace Cloud 以外的机器上,它就可以工作。

**更新**我与一位 Rackspace Cloud 代表谈过,他提到如果您要从他们的服务器进行 ftp,他们需要被动 ftp。我将远程服务器设置为处理被动 ftp 连接,并已验证被动 ftp 现在可以通过 OSX Transmit ftp 客户端在远程服务器上运行。我补充说:

ftp_pasv($file_handle, true);

紧接在 fopen() 语句之后,但我从 PHP 收到错误消息,提示我没有向 ftp_pasv() 提供有效资源。如何确保 PHP 与 ftp 站点的连接是 PASV 而不是 ACTIVE 并且仍然使用 fwrite()?顺便说一下,我注意到 Windows 机器报告说我的 PHP 代码写入的文件在磁盘上有 4096 字节。它永远不会超过这个数量。这导致我将 output_buffering php 值更改为 65536 只是为了排除故障,但这也没有解决问题。 . .

** 更新部分 DUEX **

在 Rackspace 云站点产品上解决我的虚拟服务器上的问题被证明太困难了,因为它们没有提供足够的管理员权限。我在 Rackspace 的云服务器产品上创建了一个非常小的云服务器,并将所有配置配置到我仍然看到与 fwrite() 相同的错误的程度。为了确保我可以将文件从该服务器写入远程服务器,我在云服务器上的 bash shell 中使用了基本的 ftp 命令。它运作良好。因此,我假设 fwrite() 的 php 实现中存在错误,这可能是由于某种类型的数据限制问题造成的。当我从我的本地环境写入远程服务器时,与 Rackspace 云服务器上提供的相比,它的速度较慢,但​​它工作正常。有什么办法可以有效地降低写入速度?只是问问 :)

** 更新第三部分*

因此,我采纳了@a sad dude 的建议并实现了一个功能,该功能可能有助于尝试写入新文件并通过 ftp 将其完整发送的人:

function writeFileAndFTP($filename=null, $data=null, $node=null, $local_path=null, $remote_path=null)
{

// !Determin the path and the file to upload from the webserver
$file = $local_path.'/'.$filename;


// !Open a new file to write to on the local machine
if (!($file_handle = fopen($file, "wb", 0))) {
die("There was a problem opening ".$file." for writing!");
}


// !Write the file to local disk
if ($bytesWritten = fwrite($file_handle, $data) ) {
//echo "There were " . $bytesWritten . " bytes written to " . $file;
}

// !Close the file from writing
if (!fclose($file_handle)) {
die("There was a problem closing " . $file);
}

// !Create connection to remote FTP server
$ftp_cxn = ftp_connect($node['addr'], $node['ftp_port']) or die("Couldn't connect to the ftp server.");

// !Login to the remote server
ftp_login($ftp_cxn, $node['user'], getPwd($node['ID'])) or die("Couldn't login to the ftp server.");

// !Set PASV or ACTIVE FTP
ftp_pasv($ftp_cxn, true);


// !Upload the file
if (!ftp_put($ftp_cxn, $remote_path.'/'.$filename, $file, FTP_ASCII)) {
die("There was an issue ftp'ing the file to ".$node['addr'].$remote_path);
}

// !Close the ftp connection
ftp_close($ftp_cxn);

}

最佳答案

fwrite 可以一次写入的字符串的长度在某些平台上是有限制的(这就是它返回写入的字节数的原因)。您可以尝试在循环中运行它,但更好的办法是简单地使用 file_put_contents,这样可以保证写入整个字符串。

http://www.php.net/manual/en/function.file-put-contents.php

关于php fwrite() 没有完成将字符串数据写入文件,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9473474/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com