8月15日に北京に来てから今日までで1ヶ月以上が経ちました。この間、筆記試験や面接の準備を進め、大小合わせて10社以上の面接を受け、ようやく落ち着いたところです。面接を通して自分が大きく成長したと感じました。初めてこの見知らぬ街に来たとき、私は地下鉄に乗る方法も、バスに乗る方法も、正しい生活を送る方法もわかりませんでした。 。 。
面接は就職の最初のハードル 自分の学校が普通すぎたので、面接では高学歴の人に比べて本当に自信がありませんでした。面接の方向性はPHP開発エンジニアで、主にWebサイトのバックエンドやAPPインターフェースなどを担当しています。 私が面接した企業、テストの質問、体験談はすべて私の個人ウェブサイトに掲載されています。ご興味があれば、ぜひご覧ください:
PHP のいくつかの出力関数 echo、print()、print_r()、sprintf()、var_dump() の違い
1: echo: は関数ではなくステートメントであり、戻り値がなく、複数の変数値を出力でき、かっこは必要ありません。配列とオブジェクトは出力できません。出力できるのは単純な型 (int、string など) のみです。
2: print: これは関数ではなくステートメントであり、戻り値は 1 であり、括弧は必要ありません。配列とオブジェクトは出力できません。出力できるのは単純な型 (int、string など) のみです。
3: print_r: は、stirng、int、float、array、object などの複合型を出力できる関数です。
Y 出力配列が構造体で表現されている場合、それを print_r ($ str, true) で使用して、print_r を出力せずに返すことができます。4: printf: テキストを整形して出力する関数です(C言語を参照)
5: sprintf: printf に似た関数ですが、印刷は行わず、書式設定されたテキストを返します (この関数は、書式設定された文字列を出力する代わりに変数に書き込みます)、その他 printf と同じです。
例: $str = "Hello"; $number = 123;
$txt6: var_dump(): 関数。変数の内容、型、または文字列の内容、型、長さを出力します。デバッグによく使用されます。
複数のスレッドが同時にファイルを読み書きする問題を解決する関数を作成します。
リーリー
Cookieセッション使用プランを無効にする、 セッション有効期限の設定方法、対応する機能:URL を通じて値を渡し、URL にセッション ID を追加します (欠点: 純粋に静的なページのセッション ID は次のページに渡されないため、サイト全体に純粋に静的なページは存在できません) フォームを非表示にすることで、フォームの非表示テキストボックスにセッションIDを入力してフォームと一緒に送信します(欠点:直接ジャンプする3499910bf9dac5ae3c52d5ede7383485タグなどのフォーム以外の状況には適用されません) php.iniファイルを直接設定し、php.iniファイルのsession.use_trans_sid= 0を1に設定します(Winではサポートされていないようです) セッションIDをファイル、データベースなどに保存し、クロスページプロセス中に手動で呼び出します
リーリー json形式のデータの特徴は何ですかJSON は軽量のデータ交換形式です。これは ECMAScript のサブセットに基づいています。 JSON は完全に言語に依存しないテキスト形式を使用しますが、C 言語ファミリー (C、C++、C#、Java、JavaScript、Perl、Python など) に似た規則も使用します。これらの特性により、JSON は理想的なデータ交換言語になります。 人間にとっては読み書きが容易で、機械にとっては解析と生成(ネットワーク伝送速度)が容易です。 JSONの構造は以下の2点に基づいています
1. 「名前/値」ペアのコレクション さまざまな言語では、オブジェクト、レコード、構造、辞書、キー付きリストなどとして理解されます。PHP 如何获取客户端的IP地址,
用$_SERVER获取的IP地址有什么问题?
$_SERVER['REMOTE_ADDR'] ; 通过全局数组来获得
getenv('REMOTE_ADDR') ; 通过环境变量来获得
当客户机使用代理的时候获取不到真实的IP地址
写一个函数,可以遍历文件夹下的所有文件和文件夹。
<span> 1</span> <span>function</span> get_dir_info(<span>$path</span><span>){ </span><span> 2</span> <span>$handle</span> = <span>opendir</span>(<span>$path</span>);<span>//</span><span>打开目录返回句柄</span> <span> 3</span> <span>while</span>((<span>$content</span> = <span>readdir</span>(<span>$handle</span>))!== <span>false</span><span>){ </span><span> 4</span> <span>$new_dir</span> = <span>$path</span> . DIRECTORY_SEPARATOR . <span>$content</span><span>; </span><span> 5</span> <span>if</span>(<span>$content</span> == '..' || <span>$content</span> == '.'<span>){ </span><span> 6</span> <span>continue</span><span>; </span><span> 7</span> <span> } </span><span> 8</span> <span>if</span>(<span>is_dir</span>(<span>$new_dir</span><span>)){ </span><span> 9</span> <span>echo</span> "<br>目录:".<span>$new_dir</span> . '<br>'<span>; </span><span>10</span> get_dir_info(<span>$new_dir</span><span>); </span><span>11</span> }<span>else</span><span>{ </span><span>12</span> <span>echo</span> "文件:".<span>$path</span>.':'.<span>$content</span> .'<br>'<span>; </span><span>13</span> <span> } </span><span>14</span> <span> } </span><span>15</span> <span> } </span><span>16</span> get_dir_info(<span>$dir</span>);
有mail.log的一个文档,内容为若干邮件地址,用’\n’分隔换行。挑选sina.com的地址(包括从文件读取、过滤到列印出来)。
思路1:用正则表达式(比较慢,效率地,不推荐用)
思路2:cat mail.log | grep sina.com
PHP缓存技术有哪些? tp是局部还是完全缓存?
1. 全页面静态化缓存,也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程
一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
<span> 1</span> <<span>?php </span><span> 2</span> <span>function</span> fuhuan(<span>$allnum</span>, <span>$ti</span><span>){ </span><span> 3</span> <span>$arr</span> = <span>array</span><span>(); </span><span> 4</span> <span>for</span>(<span>$i</span> = 0; <span>$i</span> < <span>$allnum</span>; <span>$i</span>++<span>){ </span><span> 5</span> <span>$arr</span>[<span>$i</span>] = <span>$i</span><span>; </span><span> 6</span> <span> } </span><span> 7</span> <span> 8</span> <span>$nums</span> = 1<span>; </span><span> 9</span> <span>while</span>(<span>count</span>(<span>$arr</span>) > 1<span>){ </span><span>10</span> <span>foreach</span> (<span>$arr</span> <span>as</span> <span>$key</span> => <span>$value</span><span>) { </span><span>11</span> <span>if</span>(<span>$nums</span> == <span>$ti</span><span>){ </span><span>12</span> <span>unset</span>(<span>$arr</span>[<span>$key</span><span>]); </span><span>13</span> <span>$nums</span> = 1<span>; </span><span>14</span> }<span>else</span><span>{ </span><span>15</span> <span>$nums</span>++<span>; </span><span>16</span> <span> } </span><span>17</span> <span> } </span><span>18</span> <span> } </span><span>19</span> <span>$new_arr</span> = <span>array_values</span>(<span>$arr</span><span>); </span><span>20</span> <span>var_dump</span>(<span>$new_arr</span>[0] + 1<span>); </span><span>21</span> <span> } </span><span>22</span> fuhuan(10,10);
isset() 、empty()与is_null的区别
1、当变量未定义时,is_null()和“参数本身”是不允许作为参数判断的,会报Notice警告错误;
2、empty,isset首先都会检查变量是否存在,然后对变量值进行检测。而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误!
3、isset():仅当null和未定义,返回false;
4、empty():""、0、"0"、NULL、FALSE、array(),未定义,均返回false;
5、is_null():仅判断是否为null,未定义 报警告;
6、变量本身作为参数,与empty()一致,但接受未定义变量时,报警告;
求两个文件的相对路径
<span> 1</span> getpath('/a/b/c/d/e.php', '/a/d/12/34/c.php'<span>); </span><span> 2</span> <span> 3</span> <span>function</span> getpath(<span>$a</span>, <span>$b</span><span>){ </span><span> 4</span> <span>$aarr</span> = <span>explode</span>('/', <span>$a</span><span>); </span><span> 5</span> <span>$barr</span> = <span>explode</span>('/', <span>$b</span><span>); </span><span> 6</span> <span>$count</span> = <span>count</span>(<span>$barr</span>) - 2<span>; </span><span> 7</span> <span>$pathinfo</span> = ''<span>; </span><span> 8</span> <span>for</span>(<span>$i</span> = 1; <span>$i</span> <= <span>$count</span>; <span>$i</span>++<span>){ </span><span> 9</span> <span>if</span>(<span>$aarr</span>[<span>$i</span>] == <span>$barr</span>[<span>$i</span><span>]){ </span><span>10</span> <span>$pathinfo</span> .= '../'<span>; </span><span>11</span> }<span>else</span><span>{ </span><span>12</span> <span>$pathinfo</span> .= <span>$barr</span>[<span>$i</span>] . '/'<span>; </span><span>13</span> <span> } </span><span>14</span> <span> } </span><span>15</span> <span>echo</span> <span>$pathinfo</span><span>; </span><span>16</span> }
MVCの長所と短所 1. MVC の利点
3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建session。简单,高效, 服务器的压力减小了,因为session数据不存在服务器磁盘上。根本就不会出现session读取不到的问题。
问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送session数据给服务器,session中数据不能太多,浏览器对cookie 的大
小存在限制。不适合高访问量的情况,因为高访问量的情况下。
正则表达式
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/db05f8e866f47612e82f5cb19e67888c.*25949ccbf68a5e928aa04bb49571e4d5|b1ca7e9394ce1dfc0ddfd739020cabe6/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?
匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$
core文件是什么,有什么用?
<span> core是unix系统的内核。当你的程序出现内存越界的时候,操作系统会中止你的进程,并将当前内存状态倒出到core文件中,以便进一步分析。程序员可以通过core文件来找出问题所在。它记录了程序挂掉时详细的状态描述。</span>
<span><strong>什么是core dump</strong> Core的意思是内存, Dump的意思是扔出来, 堆出来。开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,它可以做为调试程序的参考. core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。如何使用core文件 gdb -c core文件路径 [应用程序的路径],进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.</span>
<span><strong>为什么没有core文件生成呢?</strong> core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.</span>
<span><strong>ulimit -c unlimited</strong> core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号</span>
不用core文件,程序出了问题产生信号是否知道?答:内核向进程发信号嘛。
共享内存除了文件映射还有什么方式?
共享内存对象映射。
二者有什么区别:
答:内存映射文件是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合于用来管理大文件。
请解释下列10个shell命令的用途
cat:把一个或多个文件内容显示到标准输出
chmod:改变文件属性
chgrp:改变用户分组
grep:在文件内进行搜索
wc:命令的功能为统计指定文件中的字节数、字数、行数, 并将统计结果显示输出。
Linux文件属性有哪些?(共十位)
-rw-r--r--那个是权限符号,总共是- --- --- ---这几个位。
第一个短横处是文件类型识别符:-表示普通文件;c表示字符设备(character);b表示块设备(block);d表示目录 (directory);l表示链接文件(link);后面第一个三个连续的短横是用户权限位(User),第二个三个连续短横是组权限位 (Group),第三个三个连续短横是其他权限位(Other)。每个权限位有三个权限,r(读权限),w(写权限),x(执行权限)。如果每个权限位都 有权限存在,那么满权限的情况就是:-rwxrwxrwx;权限为空的情况就是- --- --- ---。
权限的设定可以用chmod命令,其格式位:chmod ugoa+/-/=rwx filename/directory。例如:
ファイル aaa には完全に空の権限があります - --- --- ---。
chmod u+rw aaa (ユーザー許可ビットに読み取りおよび書き込み許可を設定します。許可は次のように表されます: - rw- --- ---)
chmod g+r aaa (グループの権限を読み取り可能に設定します。その権限は次のように表されます: - --- r-- ---)
chmod ugo+rw aaa (ユーザー、グループ、他のユーザーまたはグループの読み取りと書き込みの権限を設定します。権限は次のように表されます: - rw- rw- rw-)
aaa が完全な権限を持っている場合 - rwx rwx rwx。
chmod u-x aaa (ユーザーの実行可能権限を削除します。権限は次のように表現されます: - rw- rwx rwx)
aaa - rwx r-x r-x にカスタム権限を付与する場合、コマンドは次のとおりです:
chmod u=rwx、go=rx aaa
Apache と Nginx の長所と短所の比較
cgi は 2000 年以前によく使用されていました。Web サーバーは一般に、このリクエストの内容に基づいて新しいプロセスをフォークして外部 C プログラム (または Perl スクリプト) を実行していました。 .)、このプロセスは処理されたデータを Web サーバーに返します。最後に、Web サーバーはコンテンツをユーザーに送信し、フォークされたばかりのプロセスも終了します。 ユーザーが次回動的スクリプトの変更を要求すると、Web サーバーは再び新しいプロセスをフォークし、サイクルが継続します。
後に登場したより高度な方法は、Web サーバーに Perl インタープリターまたは php インタープリターを組み込むことができるというものです。 つまり、これらのインタープリタはモジュール化されており、Web サーバーは起動時にこれらのインタープリタを起動します。 新しい動的リクエストが受信されると、Web サーバーはこれらの Perl または php スクリプトを独自に解析するため、プロセスを再フォークする必要がなくなり、効率が向上します。
Fastcgi の方式では、Web サーバーがリクエストを受信したときにプロセスを再フォークしません (このプロセスは Web サーバーの起動時に開始され、終了しないため)。Web サーバーはコンテンツをこのプロセスに直接渡します。 (プロセス間通信ですが、fastcgi は別の方法である tcp 通信を使用します) このプロセスは、リクエストを受信した後に処理し、結果を Web サーバーに返し、最後に終了せずに次のリクエストの到着を待ちます。 gFastcgi と CGI の違いは次のとおりです。
Cgi 読み取りパラメータを処理するための新しいプロセスをフォークし、データを処理して、ライフサイクルを終了します。 高速CGI tcp を使用して、リモート マシン上のプロセスまたはローカル プロセスとの接続を確立します。tcp ポートを開くには、ループに入り、データの到着を待ち、データを処理します
例: サーバーには 100,000 の単語があり、クライアントは毎回文字列を送信し、この文字列の前に付けられる単語の数を尋ねます。 その後、トライ ツリーを構築するプログラムを作成すると、ユーザーがリクエストするたびにトライを直接検索できるようになります。 ただし、CGI を使用すると、このリクエストの後にトライが失われ、次回プロセスを開始するときに新しいトライ ツリーを作成する必要があります。これはあまりにも非効率です。 fastcgi メソッドを使用すると、このレッスンのトライ ツリーはプロセスの開始時に確立され、後でトライ ツリー上の指定されたプレフィックスを直接クエリできます。
select、pol、epoll の違い 選択
select は 1983 年の 4.2BSD で初めて登場しました。select() システムコールを通じて複数のファイル記述子の配列を監視します。select() が返されると、配列内の準備済みのファイル記述子がカーネルによって使用されます。これにより、プロセスは後続の読み取りおよび書き込み操作のためにこれらのファイル記述子を取得できるようになります。
select は現在、ほぼすべてのプラットフォームでサポートされており、優れたクロスプラットフォーム サポートも利点の 1 つです。
select の欠点の 1 つは、単一プロセスが監視できるファイル記述子の数に上限があることです (Linux では通常 1024 です)。ただし、この制限は、マクロ定義を変更するか、カーネルを再コンパイルすることによって増やすことができます。 。
さらに、多数のファイル記述子を格納する select() によって維持されるデータ構造は、ファイル記述子の数が増加するにつれて、コピーのオーバーヘッドも直線的に増加します。同時に、ネットワーク応答時間の遅延により、多数の TCP 接続が非アクティブになりますが、select() を呼び出すとすべてのソケットの線形スキャンが実行されるため、ある程度のオーバーヘッドも無駄になります。
poll は 1986 年の System V Release 3 で誕生しました。本質的には select とあまり変わりませんが、poll にはファイル記述子の最大数に制限がありません。
ポーリングと選択には、多数のファイル記述子を含む配列が、これらのファイル記述子の準備ができているかどうかに関係なく、ユーザー モードとカーネル アドレス空間の間で全体としてコピーされ、そのオーバーヘッドが数に応じて増加するという欠点もあります。ファイル記述子の数は直線的に増加します。
さらに、select() と poll() が準備ができたファイル記述子についてプロセスに通知した後、プロセスがそれらに対して IO 操作を実行しない場合、これらのファイル記述子は次回 select() と poll() のときに再度報告されます。と呼ばれるため、通常、このメソッドはレベルトリガーと呼ばれます。
カーネルによって直接サポートされる実装メソッド、つまり epoll が登場するまでは、これまでに述べたほぼすべての利点があり、マルチチャネル I/O 対応通知として最もパフォーマンスが高いと認識されています。 Linux 2.6 の方法。
epoll は、水平トリガーとエッジ トリガー (エッジ トリガー) の両方をサポートできます。これは、どのファイル記述子が準備完了したかをプロセスに通知するだけであり、アクションを実行しない場合は、再度通知されません。この方法はエッジ トリガーと呼ばれます)、エッジ トリガーのパフォーマンスは理論的には高くなりますが、コードの実装は非常に複雑です。
epoll は、それらの準備完了ファイル記述子のみを通知します。準備完了ファイル記述子を取得するために epoll_wait() を呼び出すと、実際の記述子ではなく、準備完了記述子の数を表す値が返されるだけです。 epoll で指定された配列から対応する数のファイル記述子を順番に取得します。ここではメモリ マッピング (mmap) テクノロジも使用されており、システム コール中にこれらのファイル記述子をコピーするオーバーヘッドが完全に排除されます。
もう 1 つの重要な改善点は、epoll がイベントベースの準備完了通知メソッドを採用していることです。 select/poll では、カーネルはプロセスが特定のメソッドを呼び出した後でのみ、監視されているすべてのファイル記述子をスキャンします。一方、epoll は、事前に epoll_ctl() を通じてファイル記述子を登録します。特定のファイル記述子の準備が整うと、カーネルはコールバック メカニズムを使用します。このファイル記述子を迅速にアクティブにするコールバックに似ており、プロセスが epoll_wait() を呼び出したときに通知されます。
Memcache と Redis の違い
。