为了账号安全,请及时绑定邮箱和手机立即绑定

当 PHP 无法更改文件中的标志时,如何判断我的网站上的错误是什么?

当 PHP 无法更改文件中的标志时,如何判断我的网站上的错误是什么?

PHP
哈士奇WWW 2021-06-29 06:24:17
与学生注册网站相关,我有一个每天早上 5:00 运行的 PHP 文件,用于检查尚未支付费用的学生。如果学生没有支付费用,他们将被退学。这个文件被调用dropstudent.php,这是文件夹层次结构:cronjobs/||- dropstudent.php|- flag.txt该flag.txt文件只包含一个词 - true或false。如果该标志设置为 true,学生只能支付费用(在网站其他地方的 PHP 文件中处理)。现在,在我们丢弃学生之前,我们将标志设置为 false,执行检查并执行必要的丢弃。最后,我们将此标志设置回 true。到目前为止,这工作得很好,没有人碰过这段代码。但是最近,我们一直在抱怨学生无法支付费用。我查看了它,结果发现我们将标志重置为 true 的步骤不起作用,因为标志更改为 false 但不会返回 true。这是我的代码:#!/opt/rh/php55/root/usr/bin/php<?php// require '../dbmanage.php';require '/path to college servers/dbmanage.php';logCronJob("dropstudent", "begin");$filepath = '/path to college servers/cronjobs/flag.txt';// Change flag to false$myfile = fopen($filepath, "w") or die("Unable to open file!");$txt = "false";fwrite($myfile, $txt);// do the drop checks and other relevant stuff here// Change flag back to true$myfile = fopen($filepath, "w") or die("Unable to open file!");$txt = "true";fwrite($myfile, $txt);fclose($myfile);如果有人能告诉我如何找出这里出了什么问题,以及我能做些什么来解决它,那就太好了。如果需要,我可以发布更详细的代码(检查和删除)。
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

您需要fclose($myfile);在完成第一个之后调用fwrite(),以确保刷新缓冲区。按照您编写的方式,第一个流在脚本结束之前不会关闭。届时它将刷新其缓冲区,覆盖第二个流写入的内容。


如果您使用file_put_contents(). 它一步打开、写入和关闭文件:


#!/opt/rh/php55/root/usr/bin/php


<?php


// require '../dbmanage.php';

require '/path to college servers/dbmanage.php';


logCronJob("dropstudent", "begin");


$filepath = '/path to college servers/cronjobs/flag.txt';


// Change flag to false

file_put_contents("false", $filepath);


// do the drop checks and other relevant stuff here


// Change flag back to true

file_put_contents("true", $filepath);


查看完整回答
反对 回复 2021-07-02
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我终于解决了错误。以下是我遵循的步骤以及我在两者之间收到的错误消息:

  1. 正如@SulthanAllaudeen 所建议的那样,我在打开flag.txt.

  2. 就许可或系统升级的任何最新变化与管理人员进行了交谈。他们没有做任何改变。

  3. 按照@Barmar 的建议关闭文件句柄。

  4. 仍然不断收到同样的错误。

  5. 然后将flag.txt文件的路径从 relative 更改为 absolute。事实证明,cronjobs 需要所有路径都是绝对的,至少在我的情况下。

  6. 这解决了“权限被拒绝”错误。但是后来我开始收到错误“无法重新声明函数”。所以emails.php我包含的文件,我将其更改为include_once()并且它起作用了。

  7. 我仍然按照@Barmar 的建议关闭文件句柄,这是一个很好的做法。

TL;DR:通过提供包含的所有文件的绝对路径解决了错误。此外,将 include() 语句更改为 include_once()。


查看完整回答
反对 回复 2021-07-02
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信