您现在的位置是:技术博客 > PHPPHP 笔试题 Lucas2020-09-30 11:39【代码】563人已围观 简介这是一个刷题篇!诚然没有一个程序员喜欢笔试这个环节,然而,不少公司还是有这种莫名的‘情愫’。如果是通过笔试题来判能力高低固然是不可取的,但是笔试题可以从侧面让你看到自己的盲点和不足。有些题你可能做不出来,但是要有自己的思维方式和解决思路。 ##### 1、写代码来解决多进程/线程同时读写一个文件的问题 大家都知道,PHP是没有多线程概念的,尽管如此我们仍然可以用“不完美”的方法来模拟多线程。简单的说,就是队列处理。通过对文件进行加锁和解锁,来实现。当一个文件被一个用户操作时,该文件是被锁定的,其他用户只能等待,确实不够完美,但是也可以满足一些要求不高的应用。 ``` function T_put($filename, $string) { $fp = fopen($filename, 'a'); //追加方式打开 if (flock($fp, LOCK_EX)){ //加写锁 fputs($fp,$string); //写文件 flock($fp, LOCK_UN); //解锁 } fclose($fp); } function T_get($filename,$length){ $fp = fopen($filename,'r'); //追加方式打开 if (flock($fp, LOCK_SH)) { //加读锁 $result = fgets($fp, $length); //读取文件 flock($fp, LOCK_UN); //解锁 } fclose($fp); return $result; } ``` ##### 2、PHP的is_writeable()函数存在Bug,无法准确判断一个目录/文件是否可写,请写一个函数来判断目录/文件是否绝对可写 1、在windowns中,当文件只有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不一定是可写的。 如果是目录,在目录中新建文件并通过打开文件来判断; 如果是文件,可以通过打开文件(fopen),来测试文件是否可写。 2、在Unix中,当php配置文件中开启safe_mode时(safe_mode=on),is_writeable()同样不可用。 读取配置文件是否safe_mode是否开启。 ``` /** * Tests for file writability * is_writable() returns TRUE on Windows servers when you really can't write to * the file, based on the read-only attribute. is_writable() is also unreliable * on Unix servers if safe_mode is on. * @access private * @return void */ if ( ! function_exists('is_really_writable')) { function is_really_writable($file) { // If we're on a Unix server with safe_mode off we call is_writable if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE) { return is_writable($file); } // For windows servers and safe_mode "on" installations we'll actually // write a file then read it. Bah... if (is_dir($file)) { $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100)); if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { return FALSE; } fclose($fp); @chmod($file, DIR_WRITE_MODE); @unlink($file); return TRUE; } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { return FALSE; } fclose($fp); return TRUE; } } ``` ##### 3、如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞? 答:基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交) 1、屏蔽错误,将display_errors 设置为off 2、过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤 ``` 这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。 1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句 2 使用addslashes 将所有特殊字符过滤 3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 ' 转换成 \' ``` 3、 可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容 4、可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php ##### 4、为什么会出现僵尸进程(孤儿进程)?怎样查看僵尸进程?如何解决僵尸进程问题? 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。 ``` # 查看:使用 ps aux # 删除: ps aux | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9 ``` 转载:感谢您对Lucas个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源Lucas个人博客”。 很赞哦! ( 0 ) 上一篇:Swoole 下一篇:composer使用篇 相关文章 高并发库存防控超量 Swoole 基础篇一(初识) Sublime代码格式化 Session与Cookie 点击排行 生活不止眼前的苟且,还有诗和远方 十年一觉电影梦 奥地利基茨比厄尔 禅修治愈身心 自律成就自我 零边际成本社会 Modern PHP 鸟哥的Linux私房菜 本栏推荐 要技术,更要有创意 定时任务 Curl无法发送https请求 Lnmp环境搭建 常用的SQL函数 Windows的cmd指令 ueditor工具栏浮动bug 有趣的js插件 标签云 git laravel swoole javascript vue ajax html css sql linux docker flask django nginx apache thinkphp markdown sublime wechat layui photoshop nodejs mysql windows composer java maven springboot mybatis IDE 猜你喜欢 Swoole 基础篇一(初识) PHP进程管理器 正则的快速上手 Sublime代码格式化 Lnmp环境搭建 高并发库存防控超量 Linux之top命令 常用的SQL函数 站点信息 建站时间:2018-05-01 在线人数:1人 文章统计:263篇 总浏览量:222677次 统计数据:百度统计 个人信息:扫描二维码查看