> 헤드라인 > 본문

Tencent PHP 클래식 인터뷰 질문(답변 포함)

藏色散人
풀어 주다: 2020-09-02 15:13:25
앞으로
39617명이 탐색했습니다.

Tencent PHP 클래식 인터뷰 질문(답변 포함)

관련 추천: "2020 PHP 면접 문제 요약(모음)"

PHP 개발 엔지니어 필기 시험지

이름: PHP

1. PHP 개발 파트

1. 두 배열을 병합하는 방법에는 여러 가지가 있습니다. 유사점과 차이점을 비교해 보세요

답변:

1, array_merge()

2, '+'

3, array_merge_recursive

array_merge 단순 병합 배열

array_merge_recursive 두 배열 병합 배열 배열, 배열에 정확히 동일한 데이터가 있는 경우 재귀적으로 병합합니다.

array_combine 및 '+': 두 배열을 병합합니다. 전자의 값은 새 배열의 키 역할을 합니다

2. 사용자가 제출한 데이터가 정수인지 확인하는 함수를 작성해주세요(데이터 유형에 관계없이 2진수, 8진수, 10진수, 16진수일 수 있음)

답변: 실제로 주요 메소드는 is_int 및 Floor

if(!is_numeric($jp_total)||strpos($jp_total,".")!==false){  
    echo "不是整数";  
}else{  
    echo "是整数";  
}
로그인 후 복사
입니다

3. PHP의 strtolower() 및 strtoupper() 함수로 인해 중국어가 아닌 시스템이 설치된 서버에서 중국어 문자가 잘못된 문자로 변환될 수 있습니다. 유니코드 텍스트와 호환되는 문자열 대소문자 변환을 달성하려면 두 가지 대체 함수를 작성하십시오. 답변: 이유 예: 중국어는 여러 바이트로 구성되어 있는데, 영어 체계에서는 영어 한 글자만 1바이트밖에 안 되기 때문에 시스템은 중국어의 각 바이트에 대해 strtolower() 처리를 하게 되고, 변경된 중국어 바이트가 합쳐져서 깨져버리게 된다. 문자(새로 생성된 인코딩 맵에 해당하는 문자는 중국어가 아닐 수 있음)

수동 해결 방법: str_split(string string, intstring, intsplit_length = 1)을 사용하여 중국어처럼 3바이트로 잘라낼 수 있는 각 바이트별로 잘라냅니다. 인식된 바이트가 영문자인 경우 변환됩니다.

<?php  
function mystrtoupper($a){  
    $b = str_split($a, 1);  
    $r = &#39;&#39;;  
    foreach($b as $v){  
        $v = ord($v);  
        if($v >= 97 && $v<= 122){  
            $v -= 32;  
        }  
        $r .= chr($v);  
    }  
    return $r;  
}  


$a = &#39;a中你继续F@#$%^&*(BMDJFDoalsdkfjasl&#39;;  
echo &#39;origin string:&#39;.$a."\n";  
echo &#39;result string:&#39;;  
$r = mystrtoupper($a);  
var_dump($r);
로그인 후 복사

4. PHP의 is_writeable() 함수에 디렉토리/파일이 쓰기 가능한지 여부를 정확하게 확인할 수 없는 버그가 있습니다. 디렉토리/파일이 완전히 쓰기 가능한지 확인하는 함수를 작성해 주세요

답변: 버그는 두 가지 측면에서 존재합니다.

1. windowsns에서 파일에 읽기 전용 속성만 있으면 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&#39;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(&#39;is_really_writable&#39;))
{
    function is_really_writable($file)
    {
    // If we&#39;re on a Unix server with safe_mode off we call is_writable
    if (DIRECTORY_SEPARATOR == &#39;/&#39; AND @ini_get("safe_mode") == FALSE)
    {
        return is_writable($file);
    }

    // For windows servers and safe_mode "on" installations we&#39;ll actually
    // write a file then read it. Bah...
    if (is_dir($file))
    {
        $file = rtrim($file, &#39;/&#39;).&#39;/&#39;.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;
    }
}
로그인 후 복사

5. PHP의 chmod() 함수에 버그가 있어 설정 성공을 보장할 수 없습니다. 지정된 경로에 디렉터리/파일을 생성하고 권한 마스크가 올바르게 설정될 수 있는지 확인하는 함수를 작성하세요

답변: 저도 답을 못찾겠어요

6 . PHP 처리 업로드 파일 정보 배열의 $_FILES['type'] 파일 형식은 클라이언트 브라우저에서 제공하는 정보일 수 있습니다. 사용자가 업로드한 이미지 파일 형식이 정품인지 확인하는 함수를 작성하세요. and Reliable

답변: 업로드된 이미지 유형을 결정하기 위해 getimagesize를 사용하는 것이 $_FILES 함수 유형보다 더 안정적입니다.

동일한 파일에 대해 다른 브라우저를 사용할 경우 PHP에서 반환되는 유형 유형이 다릅니다. type 유형은 브라우저에서 제공하는

가 있습니다. 해커가 위장한 이미지 접미사가 붙은 실행 파일을 서버에 제출하는 데 사용할 수 있습니다.

getimagesize() 함수를 사용하면 업로드된 파일 형식을 확인할 수 있습니다. 아바타 파일인 경우 이와 같은 배열이 반환됩니다.

Array(
    [0] => 331
    [1] => 234
    [2] => 3
    [3] => width="331" height="234"
    [bits] => 8
    [mime] => image/png
);
로그인 후 복사

getimagesize() 함수가 이와 같은 배열을 반환하면 업로드된 파일은 아바타 파일입니다. 인덱스가 2

1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(인텔 바이트

order), 8 = TIFF(모토로라 바이트 순서)인 표현 유형 ), 9 = JPC, 10 = JP2, 11 = JPX, 12 =

JB2, 13 = SWC, 14 = IFF, 15 = WBMP, 16 = XBM,

이를 사용하여 업로드되는 아바타 유형을 제한할 수 있습니다

<?php
    $file=$_FILES[&#39;file&#39;];
    if(!empty($file))
    {
        var_dump($file);
        var_dump(getimagesize($file["tmp_name"]));
    }   
?>
로그인 후 복사

7. PHP는 URL의 데이터를 인코딩하여 Javascript와의 데이터 상호 작용을 구현합니다. 그러나 일부 특수 문자의 인코딩 및 디코딩 규칙은 Javascript의 규칙과 다릅니다. 이 차이점을 자세히 설명하고 UTF-8 데이터에 대해 다음을 작성하십시오. 문자 집합. PHP의 인코딩 및 디코딩 기능과 Javascript의 인코딩 및 디코딩 기능을 사용하면 PHP로 인코딩된 데이터가 Javascript로 올바르게 디코딩될 수 있고, Javascript로 인코딩된 데이터가 PHP

답변:

<?php
 $str = &#39;思源博客siyuantlw/tlw/sy/俺只是一个打酱油的&#39;;
 $str = iconv("GB2312",&#39;UTF-8&#39;,$str);
 $str = urlencode($str); 
?>
로그인 후 복사
//js  decodeURIComponent   貌似对GB2312编码的格式不识别,必须转为utf-8才可以,然后,如果字符串中有空格的  就转为 +  号了
<html>
 <script>
  var ds = &#39;<?php echo $str;?>&#39;;
  var dddd= decodeURIComponent (ds);
  alert(dddd);
 </script>
</html>
로그인 후 복사

8으로 올바르게 디코딩될 수 있습니다. Memcache의 핵심 다중 노드 배포 알고리즘을 설명해 보시겠습니까? 노드가 실패하면 PHP의 Memcache 클라이언트는 어떻게 처리합니까? Memcache 데이터 읽기 및 쓰기 작업의 원자성을 어떻게 보장합니까?

답변:

원리: 일관된 해시

원자성

원자성은 문제를 일으킬 수 있습니다. 간단히 말해서, A와 B는 둘 다 key1을 조작하려고 하고 둘 다 자신의 정보를 key1에 추가하므로 질문이 있을 것입니다.

memcached는 원자적인가요?

매크로

所有的被发送到memcached的单个命令是完全原子的。如果您针对同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方。它们将被串行化、先后执行。即使在多线程模式,所有的命令都是原子的;命令序列不是原子的。如果您通过get命令获取了一个item,修改了它,然后想把它set回memcached,我们不保证这个item没有被其他进程(process,未必是操作系统中的进程)操作过。在并发的情况下,您也可能覆写了一个被其他进程set的item。

memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果您使用gets命令查询某个key的item,memcached会 给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它写回到memcached中,您可以通过cas命令把那个唯一标识一起发送给 memcached。如果该item存放在memcached中的唯一标识与您提供的一致,您的写操作将会成功。如果另一个进程在这期间也修改了这个 item,那么该item存放在memcached中的唯一标识将会改变,您的写操作就会失败。

9.如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?

答:基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)

1、1 屏蔽错误,将display_errors 设置为off

2、 过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤

这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。
      1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句
      2 使用addslashes 将所有特殊字符过滤
      3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 &#39; 转换成  \&#39;
로그인 후 복사

3、 可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容

4、可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php

10.请设计一个数据结构可以实现无限级子菜单的树型菜单功能并提供菜单生成算法,用UML描述设计并写出相关PHP代码

答:还没找到答案

二、系统相关部分

1.请简述Linux、FreeBSD、Soalaris、Mac OS、Windows几种系统下进程与线程的内核实现方式、管理机制的异同

2.请简述Linux/BSD系统下进程间通讯的方式有哪些,并具体说明在PHP下如何实现

答:

管道(Pipe)及有名管道(namedpipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和SystemV的变种都支持套接字。

3.请简述Linux/BSD系统下系统的消息/事件异步通知机制有几种,并加以比较

4.简单比较TCP/UDP协议的异同,对于PHP的Socket扩展与Stream扩展,试比较两者基于TCP/UDP协议的SOCKET编程差异?

5.为什么会出现僵死进程(孤儿进程)?怎样查看僵死进程?如何解决僵死进程问题?

答:僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

查看:使用ps aux

删除:ps aux | grep -e ‘^[Zz]’ | awk ‘{print $2}’ | xargs kill -9

6.对于System-V消息队列,如何解决系统本身对于消息队列条数、总容量(字节数)的限制?如何设置消息的优先级别?请比较阻塞模式和非阻塞模式的异同,并说明如何避免非阻塞模式下的消息队列堵塞?

7.请描述Apache 2.x版本的MPM(Multi-Processing Module)机制,并具体说明在不同的MPM机制下如何支持PHP?

答:常用的应该就只有3个:worker|prefork|perchild

prefork:在功能上就是使用Apache的运行方式,一个父进程,然后根据设置以及连接情况生成相应的子进程数。这种模式可靠性和健壮性都是最好的。但是在性能上,开销过大。达不到我们这些“吸血鬼”的要求了^_^。如果连接数过多的话,会导致我们无法远程登陆,一定要等到连接数下降后才能连接,这也是最让我头痛的事情。

worker:混合线程/进程的MPM。一个父进程,后面是带有线程的子进程。每个子进程的线程数是固定且相同的。这是最“平庸”的一个模式,但也是使用人最多的一种模式。因为它性能等各方面比较均衡。性能上要比prefork好一些,只是牺牲了一点点的健壮性和可靠性而已。一般推荐使用这个选项。

perchild:也是混合线程/进程的MPM。当启动perchild MPM时,它会建立指定数量的子进程,且每个子进程都具有指定数量的线程,如负载增加了,那它不会建立新的进程(子进程是固定的),只是在子进程下建立新的线程。它还有一个特点就是可以为每一个子进程配置不同的用户和组。也可以为每个虚拟主机指定一个子进程。这种模式性能是最佳的,但是可靠性和健壮性就相对是最差的。各取所需,我个人觉得这种模式也不错,如果你不用第三方的模块的话^_^。

8.请简述PHP在Apache下的几种运行方式并加以比较?如何让PHP在Linux+Apache下以Fast CGI方式运行?

答:php在apache有3中运行方式:CGI模式、FastCGI模式、Apache 模块DLL。

比较:

Cgi模式和模块dll加载方式比较:

Cgi模式下,apache调用外部执行器php.exe执行php代码,并将解释后生成的html代码和原html整合,再传递给apache服务器,其在执行时每次都需要重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构,运行速度非常慢,但因为是外部加载执行器,php代码执行出错不会导致apache崩溃。

在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。所以从某种角度上来说,以apache模块方式安装的 PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。

Cgi和fastcgi模式比较:

Fastcig是cgi的升级版,Cgi和fastcgi工作模式大抵相同,但fastcgi模式中fastcgi的进程管理器可用来管理cgi解释器,该管理器在cgi解释器完成请求后,会处于挂起状态,用以等待接下来的请求,因为向比较cgi每次都需要重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构,fastcig模式明显要快很多。

9. 请写出让PHP能够在命令行下以脚本方式执行时安装PHP所必须指定的configure参数,并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?

答:由于 –enable-cli 和 –enable-cgi 同时默认有效,因此,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php

php -f “index.php” 
php -r “print_r(get_defined_constants());”
로그인 후 복사

10.请简述PHP 5.2的内存池及其内存管理机制、垃圾回收机制

内存管理机制

试题二:

1、请列举你能想到的UNIX信号,并说明信号用途。

答:

Unix信号量也可以在文件/usr/include/sys/signal.h中查看

SIGHUP 进程由於控制终端死去或者控制终端发出起命令

SIGINT 键盘中断所产生的信号

SIGQUIT 键盘终止

2、请列举、你能想到的所有的字符串查找算法,并加注释简单说明。

答:

1 顺序查找

2 二分查找

3 分块查找

4 哈希表查找

3、有一个IP地址(192.168.0.1),请写出其32位无符号整数形式。

答:此题是将十进制转换成二进制 采用取余法即可很简单 答案是:11000000.10101000.00000000.00000001 千万不能只记答案哦

4、写出、你能想到的所有HTTP返回状态值,并说明用途(比如:返回404表示找不到页面)

答:

200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。

301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。

403 (禁止) 服务器拒绝请求。

404 (未找到) 服务器找不到请求的网页。

500 (服务器内部错误) 服务器遇到错误,无法完成请求。

501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。

502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。

503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

基础任务-选作(会得到额外分数):

1、画几个你最熟悉的SERVER端模型出来(格式不重要,尽量将图画清楚,说明思路即可)

进阶任务:

1、PHP的垃圾收集机制是怎样的?

说明:

1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分

2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。

3)对,则有分,错误不扣,不写无分。

答:PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

2、请写出HTTP头,并符合以下要求:

1)这是一个post请求

2)目标:http://www.example.com:8080/test

3)POST变量:

username: test 
pwd: test2 
intro: Hello world!
로그인 후 복사

4)包含以下COOKIE信息:

cur_query: you&me
로그인 후 복사

说明:

1)如果,你记不得某个HTTP协议中的指令字了,那么,无奈这举是用“汉字”代替。

2)如果,你能记住更多的HTTP协议指令字,那么多写几句,总是没坏处,对吧?

3)最关键的,只需要画出正确的“轮廓”(还记得httpwatch等工具打印出来的头部吗?那就是“轮廓”的含义),也会有分数,但如果,连“轮廓”都写错了,那么就很遗憾了。

答:

Accept: text/html 可以接受的数据类型 
Accept-Encoding: gzip 接受的压缩类型 
Accept-Language: zh-CN 接受语言 
Cache-Control: no-cache 是否有缓存 
Connection : keep-alive 是否保持链接 
Host:http://www.example.com:8080/test 
Cookie:intro=Hello world! 
Content-Disposition: form-data; username=”test”&pwd=”test2”&intro=”hello world!” 
User-Agent: 浏览器信息 
Referer: 前一个页面地址
로그인 후 복사

设计任务:

1、最近总有人骚扰我们的投票模块,需要你来设计一个投票限制的东东

要求如下:

1)要求每个QQ号码(假设此QQ号码在UNIT32内可以表示)10分钟这内只能投5票。

2)我们的用户很踊跃,平均每天要有2000万人左右通过此程序投票。

说明:

1)无需写代码,只需要图跟文字即可。

2)对于关键逻辑,请用图加代码表示出来,这也是对你文字表达能力的一个考验。

3)对你能想到的所有的边界条件列出来,这是对你逻辑思维全面与敏捷性的考验。

4)存储部分,尽你所能吧。如果,你需要一个自己设计的存储层,那么把这个存储层的实现,用文字+图片方式描述清楚,要是设计合理,你会获得华丽的奖分。

答:找了好久终于找到个大神的回答:打字太累了 就截图了

Tencent PHP 클래식 인터뷰 질문(답변 포함)

Tencent PHP 클래식 인터뷰 질문(답변 포함)

Tencent PHP 클래식 인터뷰 질문(답변 포함)

编程任务:

1、我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧。

要求如下:

1)/myworks/example/bbe.txt,98版本英文圣经一本

2)输入部分要求如下:php ./example.php [单词]

3)输出部分如下:[单词] 1,2 2,4 5,6 表示:此单词在1行2列(第二个单词),2行4列…

说明:

1)此文本4MB之巨…

2)单词的含义:由英文字母(大小写),数字(0-9)组成的串

3)提供给你的机器OS为ubuntu 9.10,内存只有1G,而且,很不幸的,其中700M用来做了别的

4)上机考试不允许上网,但我装了man文档以及读取CHM以及PDF的阅读器,在电脑的桌面的CHM文件夹中,有相应的PHP参考手册

5)算法复杂度要求不能大于O(N^2)(就是N的平方)

6)什么?PHP低效且用起来不顺手,好的,你可以用别的语言来实现。但注意:提供给你的机器上只有python 2.4/perl 5.8/gcc[g++] 4.1

答:两份答案感觉还可以

bbe.txt文件咱们没有 想像成是 空格 隔开的算了

hello123 hello tim jason

woaini1 tianjianxiong333 hh aaa

/* 此文件用于根据bbe.txt文件对所有单词创建索引,相当于一次预处理 */   
ini_set(&#39;display_errors&#39;,&#39;on&#39;);  
set_time_limit(0);  
$file = file($src); // 数组  
foreach($file as $i => &$ls){  
    $a = explode(" ",$ls);  
    $len = count($a);  
    if ($len > 0){  
        for($j=0;$i<$len;$j++){  
            $data = "此单词".$a[$j]."在".($i+1)."行,".($j+1)."列";  
            $key = md5(trim(strtolower($a[$j])));  
            file_put_contents($key,$data);  
        }  
    }  
    //echo $i.". > ".$ls.&#39;<br />&#39;;  
}
로그인 후 복사

example.php:

#!/usr/local/bin/php -q   
<?php  
set_time_limit(0);   
$getkey=empty($argv[1]) ? $_REQUEST[&#39;k&#39;] : $argv[1];  
$arr = explode(",",$getkey);    
$len = count($arr);  
if($len > 0){  
    for($i=0;$i<$len;$i++){  
        echo getKey($arr[$i])."\n";  
    }  
}  
functuion getKey($key){  
    $str = "没有找到此单词[".$key."]";  
    if($key){  
        $fc = md5($key);  
        $str = file_get_contents($fc));  
    }  
    return $str;  
}  
?>
로그인 후 복사

别人的方法:

1、使用ascii码,判断字符所在范围

2、只要扫描一遍字符即可,复杂度为O(N)

3、利用了php string{$i} 的特性,取字符串内任一字符

4、todo:改为fgetc版本,可以完全不需要使用以上php特性

5、字符串匹配算法:http://wendell07.blog.hexun.com/14112681_d.html,目前看来最快的方法:Sunday,由于本题是单词匹配,问题更简单,只要找到头尾……

$word = $argv[1];  
$lines = 0;  

$handle = @fopen("bbe.txt", "r");  
if ($handle) {  
    while (!feof($handle)) {  
        $line = fgets($handle, 4096);  
        $local = local_word($line, $word);  
        $lines++;  
        if( !empty($local) ){  
            echo "$lines,".implode(&#39; &#39;,$local)."\n";  
        }  
    }  
    fclose($handle);  
}  

function local_word($line, $word){  
    $local = array();  
    $local_length = 1;  
    $word_length = strlen($word);  

    for($i = 0; ( $char = $line{$i} ) !== &#39;&#39;; $i++ ){  
        // 单词最后一个字符必定不是符号,且必有一个符号结尾,此计为一个新词  
        if( !is_symbel( $line{ $i-1 } ) && is_symbel($char) ){  
            $local_length++;  
        }      

        if( $char === $word[0] && // 如果第一个字符相同  
            is_symbel( $line{ $i-1 } ) && // 且为单词开始  
            is_symbel( $line{ $i+$word_length }) // 单词结尾应该为符号  
        ){  
            // 进入验证单词模式,一个一个字符比对  
            for($j = 1; ($w_char = $word{$j}) !== &#39;&#39;; $j++ ){  
                // 遇到单词字符不匹配  
                if( $w_char != $line{ $i+$j } ){  
                    $i += $j;  
                    break;  
                }  
                // 如果单词比对完全正确  
                if( $j == ($word_length-1) ){  
                    //echo "$line_length, $word_length\n";  
                    $local[] = $local_length;  
                }  
            }  
        }  
    }  
    return $local;  
}  

function is_symbel($char){  
    $asc = ord($char);  
    return !( (48 <= $asc && $asc <= 57) ||  
              (65 <= $asc && $asc <= 90) ||  
              (97 <= $asc && $asc <= 122) );  
}
로그인 후 복사
관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿