用户
 找回密码
 入住 CI 中国社区
搜索
查看: 3175|回复: 11
收起左侧

[控制器] 重要问题请教

[复制链接]
发表于 2018-5-30 11:40:32 | 显示全部楼层 |阅读模式
最近开发中遇到一个问题,我有一个控制器函数
public function a(){
$num=mt_rand(0,100);
file_put_contents('./userfiles/word.dat', $num,LOCK_EX);//写入word.dat文件
$data['num']=$num;
$this->load->view('tpl',$data);
}
另外一个控制器函数
public function b(){
$num = file_get_contents('./userfiles/word.dat');//读取
//接下来将$num保存到word中 具体代码不展示
}
我的想法是让word.dat作为缓存;在a函数中生成随机数$num,把这个随机数保存到word.dat中,并且展示到 tpl模板里,
然后在tpl模板里有一个 保存到word的按钮 ,通过点击按钮连接到b函数,读取word.dat,把内容保存到word;
可是我发现每次 tpl模板中展示的num和word里保存的num数值都不同,通过调试,我发现每次运行a函数,a函数都运行两次!
然后我试着运行其他的控制器函数都是这个情况.请问这是怎么回事,这个问题怎么解决.我用的是ci3
发表于 2018-5-31 14:13:14 | 显示全部楼层
别用 netbeans for php 调试 CI 的程序,应该不支持 CI 的调试。

看起来并没有执行两次,因为执行两次的话 你的视图也会 load 两次,在浏览器里你就会看到上下两个同样的内容,因为 load view 几次就会输出几次。所以你的问题只是随机数的问题。不要纠结执行两次的问题,我可以明确的告诉你 CI 不会执行两次。

关于随机数,如果很多人同时访问 a 函数的话,肯定是后面的随机数覆盖前面的随机数,你的代码里并没有处理多人访问的情况。我认为你的解决思路是有问题的,建议你说一下需求,给你一个合理的解决方案。
发表于 2018-5-31 17:46:38 | 显示全部楼层
zhaohua0317 发表于 2018-5-31 16:48
非常感谢版主的回答! 问题已经解决!
原因是由于我的每个页面里都要显示服务器时间,在我的页面header的全局j ...

你这样的获取时间的方法非常不好,同步 ajax 会阻塞页面,造成非常不好的用户体验。如果需要获取服务器时间,可以通过视图传递到页面里,不一定非得通过 ajax 获取。
 楼主| 发表于 2018-5-31 16:48:33 | 显示全部楼层
非常感谢版主的回答! 问题已经解决!
原因是由于我的每个页面里都要显示服务器时间,在我的页面header的全局js中用了这么一句: var severtime = new Date($.ajax({async:false}).getResponseHeader("Date"));
引起了每一个控制器请求都执行两遍控制器方法!不是ci的问题.
以此留注!
 楼主| 发表于 2018-5-30 14:28:53 | 显示全部楼层
只要控制器里有load->view函数 就会再执行一次这个控制器函数.请问大家是这样的吗
 楼主| 发表于 2018-5-30 16:12:40 | 显示全部楼层
谁能教教我这到底是什么问题
 楼主| 发表于 2018-5-30 17:28:36 | 显示全部楼层
我试了,每一个都带load->view的控制器方法都会执行两次!但是只是向浏览器输出第一次方法计算的值.

1

1
发表于 2018-5-31 11:48:29 | 显示全部楼层
a 函数应该是放到 URL 中对外访问的,你是用什么方式发现函数执行了两次?正常情况肯定不会执行两次,应该是你哪里用错了。
 楼主| 发表于 2018-5-31 12:31:20 | 显示全部楼层
版主你好 我就是用链接的形式,链接到A方法的;如图:
1.jpg

这就是A方法,里面有file_put_content函数
4.jpg
调试我用的netbeans for php
2.jpg
3.jpg
5.jpg
 楼主| 发表于 2018-5-31 12:34:19 | 显示全部楼层
$kjdata = $this->m_makekj->makekj(0, $sjarr);这个是随机取出的考题;保存到缓存里,
后来我竟然发现每一个带有load->view的控制器竟然都执行两遍控制器方法!
 楼主| 发表于 2018-5-31 12:36:00 | 显示全部楼层
版主有时间帮我远程一下可好?弄不了了.

本版积分规则