【Day23】几道值得研究注意的php相关问题(一)

58 篇文章 0 订阅
10 篇文章 0 订阅
1.nginx使用哪种网络协议? 
nginx是应用层 我觉得从下往上的话 传输层用的是tcp/ip 应用层用的是http 
fastcgi负责调度进程 
2. <? echo 'hello tusheng' ; ?> 没有输出结果, 可能是什么原因, 简述的解决此问题的过程(提示: 语法没有问题) 


可能服务器上面没有开启短标签short_open_tag =设置为Off,,php.ini开启短标签控制参数: short_open_tag = On 
3. 简述下面程序的输出结果, 简要说明为什么, 如何解决这类问题? 
<?php 
$tmp = 0 == "a"? 1: 2; 
echo $tmp; 
?> 


结果 1 int和string类型强制转换造成的,0==="a" 


0 == 0 肯定是true啊 
PHP是弱类型。。 
$tmp = 0 === "a"? 1: 2; 
echo $tmp; 这样就是2 

4. 已知一个字符串如下: $str = "1109063 milo 1"; 
用一行代码将该字符串里面的1109063赋值给$uid, milo赋值给$user, 1赋值给$type 


空格如下 
list($uid, $user, $type) = explode(" ", $str); 
\t如下 
list($uid, $user, $type) = explode("\t", $str); 


list($uid, $user, $type) = sscanf($str, "%d %s %d"); 


$n = sscanf($auth, "%d\t%s %s", $id, $first, $last); 

5. 分别列出如下类型的有符号和无符号范围 TINYINT SMALLINT MEDIUMINT INT 


TINYINT-2^7 - 2^7-10 ~ 2^8-1 
SMALLINT-2^15 - 2^15-1 0 ~ 2^16-1 
MEDIUMINT-2^23 - 2^23-1 0 ~ 2^24-1 
INT-2^31 - 2^31-1 0 ~ 2^32-1 
6. 将下面的数组用一行拼装成一个字符串i am milo! day day up! 
<?php 
$arr = array( 
'I', 'AM', 'MILO!', 'DAY', 'DAY', 'UP!' 
); 
?> 


$str = strtolower(implode(" ",$arr)); 
7. 调用如下函数获取函数并获取count的值 
<?php 
function get_list($cnd = array(), &$count = false) 
{ 
// 伪代码 处理$cnd 并赋值datas 
$datas = 'i am call back'; 
$count && $count = rand(1, 10000); 
return $datas; 
} 
?> 


$count=1; 
$data = get_list($cnd,&$count); 
echo $count; 

8. 几种方式去取代session机制, 简单描述各自的优劣 


mysql、memcache、cookie保持一种唯一状态标识码 
9. 下列HTTP状态码出现的可能原因, 如何处理 
200, 301, 404, 502, 503 


200 
  请求已成功,请求所希望的响应头或数据体将随此响应返回。 
301 
  被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。   新的永久性的 URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。   如果这不是一个 GET 或者 HEAD 请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。   注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。 


404 
  请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。 
502 
  作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。 
503 
  由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。   注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。 




200 OK 一切正常,对GET和POST请求的应答文档跟在后面。 
301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL 
404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。 
502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。 
503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。 
10. 有如下数据库, 用原生态mysql扩展去连接并查询user表的前十行 
host: 192.168.0.254 
port: 3306 
user: one 
pass: piece 
database: db_user 
table: user 


$link = mysql_connect("192.168.0.254:3306","one","piece") or die('Could not connect: '.mysql_error()); 
mysql_select_db('db_user',$link); 
$query = mysql_query("select * from user limit 10"); 
while($rs = mysql_fetch_array($query,MYSQL_ASSOC)) 
{



} 
11. 用autoload($class) 实现Lib目录下的类的自动加载并可以兼容子目录 
$request->action = lcfirst(implode(array_map( 
'ucfirst', 
explode('-', strtolower($request->action)) 
))); 
------------------------------------------------------------ 
function __autoload($class) 
{ 
$cls = strtolower(str_replace("_","/",$class)); 


if(file_exsits(LIB.$cls.'.php')) 
{ 
include_once(LIB.$cls.'.php'); 
} 
else 
{ 
die("not found {$class} class"); 
} 
} 
defined("LIB",'/data/wwwroot/www.xx.com/lib/'); 
$author = new Lib_Author(); 
----------------------------------------------------------- 
function __authload($class) 
{ 
$cls = explode("_",$class); 
if(@is_dir($cls[1])) 
{ 
if(@is_file($cls[2])) 
{ 
include_once("CON_PATH".$cls[1].'/'.$cls[2].".php"); 
} 
else 
{ 
dir('error'); 
} 
} 
else if(@is_file($cls[1].".php")) 
{ 
include_once("CON_PATH".$cls[1].".php"); 
} 
else 
{ 
dir('error'); 
} 
} 
--------------------------------------- 
function __autoload($class) 
{ 
$cls = explode("_",$class); 
$file = get_file($cls); 
if($file=='error') 
{ 
die('error'); 
} 
include_once($file); 
} 
function get_file($dir) 
{ 
if(is_array($dir)) 
{ 
foreach($dir as $k=>$v) 
{ 
$tmpdir .= $v.'/'; 
if(is_dir('CON_PATH'.$tmpdir)) 
{ 
continue(); 
} 
else if(is_file('CON_PATH'.$tmpdir.".php")) 
{ 
return 'CON_PATH'.$tmpdir.".php"; 
} 
else 
{ 
return 'error'; 
} 
} 
return 'error'; 
} 
return 'error'; 
} 


defined("CON_PATH","/data/wwwroot/www.xx.com/app/cntroller/"); 
$sb = new controller_sb(); 
------------------------------------ 
function __autoload_my_classes($classname) 
{ 
# ... your logic to include classes here 
} 
spl_autoload_register('__autoload_my_classes'); 
----------------------------------------------------------- 
12. 用set_error_handle 去捕获错误并输出, 级别自己定 
set_error_handle(callback,level) 
function callback(int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] ){ 
} 


function dealErrorHandler($errno,$errstr,$errfile,$errline) 
{ 
switch($errno){ 
case E_USER_ERROR: 
echo "error [$errno] $errstr fatal error on line $errline in file $errfile"; 
break; 
case E_USER_WARNING: 
echo "my warning [$errno] $errstr": 
break; 
case E_USER_NOTICE: 
echo "my notice[$errno] $errstr"; 
break; 
default: 
echo "unkonwn error type :[$errno] $errstr"; 
break; 
} 
} 
set_erro_handler(dealErrorHandler); 


trigger_error("notice", E_USER_NOTICE); 
trigger_error("warning", E_USER_WARNING); 
trigger_error("error", E_USER_ERROR); 
13. 简述两种屏蔽php程序的notice警告的方法 


初始化变量,文件开始设置错误级别或者修改php.ini 设置error_reporting 
set_error_handler 和 @抑制错误 


1.在程序中添加:error_reporting (E_ALL & ~E_NOTICE); 


2.或者修改php.ini中的:error_reporting = E_ALL 


改为:error_reporting = E_ALL & ~E_NOTICE 
3.error_reporting(0);或者修改php.inidisplay_errors=Off 
14. instanceof的作用, 经常在什么设计模式中使用 


单例模式,但是其他的模式也会用到 
15. 1023用二进制表示, 并简述计算过程 


10-2 
1023%2=1 
511%2 =1 
255%2 =1 
127%2 =1 
63%2 =1 
31%2 =1 
15%2 =1 
7%2 =1 
3%2 =1 
1%2 =1 
0 =0 
------------------------------------------- 
1023 
2^9=<N<2^10 
511 


k=9 
10 9 8 7 6 5 4 3 2 1 
1 1 1 1 1 1 1 1 1 1 
---------------------- 
1023 1 
1023-1/2=511 1 
511-1/2=255 1 
255-1/2=127 1 
127-1/2=63 1 
63-1/2=31 1 
31-1/2=15 1 
15-1/2=7 1 
7-1/2=3 1 
3-1/2=1 1 




----------------------------------------------- 


2-10 


只需用将二进制数的各个位上的数从最右边开始,最右边的第一个数乘以二的零次方,第二个数乘以二的一次方,第三个数乘以二的二次方,依次类推可得第n个数乘以二的(n-1)次方,然后把得到的结果相加即可
例如:110011=1*2^0+1*2^1+0*2^2+0*2^3+1*2^4+1*2^5=51 
这也可以算是一个公式就是An*2^(n-1) An表示二进制数最右边开始的第n个数, 
将第一项第二项第三项一直到第n项用式子An*2^(n-1) 计算出来并加在一起即可 
16. 下面php程序输出的内容是什么? 为什么? 
<?php 
$str = "aa\tbb\tcc"; 
@list($a, $b, $c) = explode('\t', $str); 
echo $a,$b,$c; 
?> 


aabbcc;//'\t'不会以\t切割字符串,explode之后申城一个array(0=>"aa\tbb\tcc")所以。。。,'\t'换成"\t"就被切割 
17. includerequire 分别返回什么错误级别 


include会系统警告并继续执行,require会发出系统警告但是会引致致命错误令脚本终止运行 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答这个问题。 以下是实现代码: ```c #include <stdio.h> typedef struct { int year; int month; int day; } Date; int is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } int get_day_of_year(Date date) { int days_of_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int day_of_year = 0; for (int i = 0; i < date.month - 1; i++) { day_of_year += days_of_month[i]; } if (date.month > 2 && is_leap_year(date.year)) { day_of_year++; } day_of_year += date.day; return day_of_year; } int main() { Date date = {2021, 3, 4}; int day_of_year = get_day_of_year(date); printf("%d-%d-%d is the %dth day of year %d.\n", date.year, date.month, date.day, day_of_year, date.year); return 0; } ``` 程序中,我们首先定义了一个 `Date` 结构体,包含了年、月、日三个成员变量。接着,我们实现了两个函数: - `is_leap_year`:判断一个年份是否是闰年,如果是闰年返回 1,否则返回 0。 - `get_day_of_year`:计算一个日期是当年中的第几天。我们首先定义了一个数组 `days_of_month`,其中包含了每个月的天数。然后,我们遍历日期的月份之前的所有月份,将对应的天数累加到变量 `day_of_year` 中。如果日期的月份大于 2 且该年是闰年,我们还需要将天数加 1。最后,我们再将日期的日数加到 `day_of_year` 中,返回计算出的结果。 在 `main` 函数中,我们定义了一个 `Date` 类型的变量 `date`,并将其初始化为 `{2021, 3, 4}`。然后,我们调用 `get_day_of_year` 函数计算出该日期是当年中的第几天,并打印输出结果。 输出结果为: ``` 2021-3-4 is the 63th day of year 2021. ``` 注意:本程序中的闰年判断方法是常见的基于公历的闰年判断方法。在历法的研究中,还存在其他不同的闰年规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值