PHPインタビューの概要

WBOY
リリース: 2016-07-29 09:14:51
オリジナル
1029 人が閲覧しました

8月15日に北京に来てから今日まで1ヶ月以上が経ちました。この間、筆記試験や面接の準備を進め、大小合わせて10社以上の面接を受け、ようやく落ち着いたところです。面接を通して自分が大きく成長したと感じました。初めてこの見知らぬ街に来たとき、私は地下鉄に乗る方法も、バスに乗る方法も、正しい生活を送る方法もわかりませんでした。 。 。

面接は職場に入る最初のハードルだったので、自分の学校があまりにも普通すぎたので、面接では高学歴の人に比べて本当に自信がありませんでした。私の面接の方向性はPHP開発エンジニアで、主にWebサイトのバックエンドやAPPインターフェースなどを担当しています。私が面接した企業、テストの質問、体験談はすべて私の個人ウェブサイトに掲載されています。ご興味がございましたら、http://dwz.cn/1KMpea をご覧ください。 以下は私がこの期間のインタビューでまとめた常識事項ですので、皆さんのお役に立てれば幸いです。間違いがあればご指摘ください。

まとめ:

面接でよくある質問に沿ってphp部分をまとめてみました 以下の質問は面接で出現率が高いです。質問は比較的基本的なものです

----------------------------PHP部分---- -------------- ------

いくつかの出力関数 echo、print()、print_r()、sprintf()、var_dump( ) PHP

1: echo: Yes このステートメントは関数ではなく、戻り値がなく、複数の変数値を出力でき、かっこは必要ありません。配列とオブジェクトは出力できません。単純な型 (int、string など) のみを出力できます。

2: print: これは関数ではなくステートメントであり、戻り値は 1 であり、出力できる変数は 1 つだけです。括弧は必要ありません。配列とオブジェクトは出力できません。単純な型 (int、string など) のみを出力できます。

3 ) print_r を出力せず、print_r の処理された値を返すようにします

4: printf: これは、テキストをフォーマットしてから出力する関数です (C 言語を参照)

5: sprintf:これは printf に似た関数ですが、印刷は行わず、書式設定されたテキストを返します (この関数は、書式設定された文字列を出力する代わりに変数に書き込みます)。残りは printf と同じです。

例: $str = "Hello"; $number = 123;

$txt = sprintf("%s 世界。日番号 %u",$str,$number); Hello world 123 日目

6: var_dump(): 関数、変数の内容、型、または文字列の内容、型、および長さを出力します。デバッグによく使用されます。

複数のスレッドが同時にファイルを読み書きする問題を解決する関数を作成します。

<span> 1</span> <?<span>php
</span><span> 2</span><span>$fp</span> = <span>fopen</span>("/tmp/lock.txt","w+"<span>);
</span><span> 3</span><span>if</span>(<span>flock</span>(<span>$fp</span>, LOCK_EX)){<span>//</span><span> 进行排它型锁定</span><span> 4</span><span>fwrite</span>(<span>$fp</span>,"Write something here\n"<span>);
</span><span> 5</span><span>flock</span>(<span>$fp</span>, LOCK_UN);<span>//</span><span> 释放锁定</span><span> 6</span>     }<span>else</span><span>{
</span><span> 7</span><span>echo</span> "Couldn't lock the file !"<span>;
</span><span> 8</span><span>    }
</span><span> 9</span><span>fclose</span>(<span>$fp</span><span>);
</span><span>10</span> ?>
ログイン後にコピー

Cookieを無効にする

Session

の使用計画、

Session

の有効期限メソッド、対応する関数: URL、

Session

idを介した値が添付されています(欠点: 純粋に静的なページの

Session

ID が次のページに渡されないため、サイト全体に純粋に静的なページは存在できません)

フォームを非表示にすることで、Session ID を入力しますフォーム内 隠しテキスト ボックスはフォームと一緒に送信されます (欠点: タグが直接ジャンプするフォーム以外の状況には適用されません)

php.ini ファイルを直接設定し、 を変更しますphp.ini ファイルのセッション .use_trans_sid= 0 が 1 に設定されます (Win ではサポートされていないようです)

セッション ID をファイル、データベースなどの形式で保存し、手動で呼び出しますクロスページプロセス中

<span> 1</span> 第一种  <span>setcookie</span><span>() 直接用setcookie设置<strong>Session</strong> id的生命周期。
</span><span> 2</span><span> 3</span><span>$lifetime</span>=60; <span>//</span><span>保存1分钟 </span><span> 4</span><span><strong>Session</strong>_start</span><span>(); 
</span><span> 5</span><span>setcookie</span>(<span><strong>Session</strong>_name</span>(), <span><strong>Session</strong>_id</span>(), <span>time</span>()+<span>$lifetime</span>, "/"<span>);
</span><span> 6</span> 第二种  <span><strong>Session</strong>_set_cookie_params</span><span>()    
</span><span> 7</span><span>$lifetime</span>=60;<span>//</span><span>保存1分钟</span><span> 8</span><span><strong>Session</strong>_set_cookie_params</span>(<span>$lifetime</span><span>);
</span><span> 9</span><span><strong>Session</strong>_start</span><span>();
</span><span>10</span><span><strong>Session</strong>_regenerate_id</span>(<span>true</span><span>);
</span><span>11</span>     其中<strong>Session</strong>_regenerate_id();方法用于改变当前<strong>Session</strong>_id的值,并保留<strong>Session</strong>中数组的值。参数默认为 <span>false</span>,如果设置为true则改变<strong>Session</strong>_id的值,并清空当前<strong>Session</strong>数组。
ログイン後にコピー
JSON形式データの特徴は何ですか

JSONは軽量なデータ交換形式です。これは ECMAScript のサブセットに基づいています。 JSON は完全に言語に依存しないテキスト形式を使用しますが、C 言語ファミリー (C、C++、C#、Java、JavaScript、Perl、Python など) に似た規則も使用します。これらの特性により、JSON は理想的なデータ交換言語になります。 人間にとっては読み書きが容易で、機械にとっては解析と生成(ネットワーク伝送速度)が容易です。 JSONの構造は次の2点に基づいています

1.「名前/値」ペアのコレクション

異なる言語では、object(オブジェクト)、レコード(レコード)として理解されます。 )、構造体 (struct )、辞書、ハッシュ テーブル、キー付きリストなど

2. 値の順序付きリスト は、ほとんどの言語で配列として理解されます
ファイル内容を取得するphpメソッド、対応する関数
1: file_get_contents はファイルのコンテンツを取得し (get と post で取得可能)、ファイル全体が文字列に読み込まれます

2: fopen を使用して URL を開き、次のようにコンテンツを取得しますget (fgets( ) 関数の助けを借りて)

3: fsockopen 関数を使用して URL (get と post で取得可能) を開き、ヘッダーと本文を含む完全なデータを get で取得します

4:curl ライブラリを使用してコンテンツを取得します。curl ライブラリを使用する前に、php.ini をチェックして、curl 拡張機能がオンになっているかどうかを確認する必要があります

一般的な PHP とは何ですか配列関数? (array_merge、in_arrayの役割)

1. 配列の基本的な操作関数

array_values($arr) //配列の値を取得します

array_keys($arr); //配列のキー名を取得します

array_flip($arr ; 厳密な型チェックです

array_reverse($arr); key_exists(" apple", $arr); //指定されたキー名が配列に存在するかどうかを取得します

array_count_values($arr); 2. 配列のセグメント化と充填

array_slice($arr, 0, 3); // この関数はキー名 (配列のセグメント化) を無視します

array_splice($arr, 0, 3); , 0, 3, array("black","maroon")); //前の関数との違いは、返された配列が元の配列から削除されることです

array_chunk( $arr, 3, TRUE); //配列は複数に分割できます。TRUE は元の配列のキー名を保持します (複数の配列を分割します)

4. 配列とスタック、キュー

array_push($arr, "apple", "pear"); // 1 つ以上の要素を配列スタックの最後にプッシュし (push)、プッシュされた要素の数を返します。スタックに追加 Number

array_pop($arr); // 配列スタックの最後の要素をポップします

array_shift($arr); // 配列の最初の要素を移動して返します ( array 長さが 1 減り、他の要素が 1 つ前に移動し、数値キー名が 0 からカウントするように変更され、テキスト キー名は変更されません)

array_unshift($arr,"a",array( 1,2)); // 配列の先頭に 1 つ以上の要素を挿入します

6. 配列のソート

sort($arr) // キー名を無視します。

rsort($arr); // 大きいものから小さいものまで、キー名を無視します

asort($arr); // 小さいものから大きいものまで、キー名を維持します

arsort($arr);大きいものから小さいものまで、キー名を維持します

ksort($arr) // キー名で正の順序で並べ替えます krsort($arr) // キー名で逆順に並べ替えます


;

7. 配列の計算

array_sum($arr); // 配列内のすべての要素の合計演算を実行します (配列要素の合計)

array_merge($arr1, $arr2); // 2 つをマージしますまたはそれ以上 (同じ文字列キー名、後者は前の同じ数値キー名を上書き、後者は最後に追加されます)

array_diff($arr1, $arr2);差分セットの結果配列 array_diff_assoc($arr1, $arr2, $arr3); // 差分セットの結果配列を返します。キー名も比較されます

array_intersect($arr1, $arr2) / / 交差結果の配列を返す array_intersect_assoc($arr1, $arr2); // 交差結果の配列を返します。キー名も比較されます

array_unique($arr); /Remove 配列内で繰り返される値については、元のキー名が新しい配列に保持されます

shuffle($arr);方法:__construct(),__destruct(),    方法重载:__call(),__callStatic()。

属性重载:__get(),__set(),__isset(),__unset(),这四个只对类中,私有,受保护的成员属性有效

__toString(),__autoload();

_set_state(); //自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组。

 

__clone();       //通常用于对副本进行重新初始化,

说明:this指副本对象引用,that指原对象引用 等方法在 PHP 中被称为”魔术方法”。PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。在命名自己的类方法时不能使用这些方法名,除非是想使用其魔术功能。

 

常量:__LINK__     //文件中的当前行号

        __FILE__       //文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

        __DIR__       //文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录,它等价于 dirname(__FILE__)。

 

        __FUNCTION__      //函数名称。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __CLASS__             //类的名称。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

        __METHOD__        //类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

        __NAMESPACE__   //当前命名空间的名称(大小写敏感)。这个常量是在编译时定义的(PHP 5.3.0 新增)

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服务器解析的流程
2. 页面部分缓存,将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示
3. 数据缓存,通过一个id进行请求的数据,将数据缓存到一个php文件中,id和文件是对应的,下次通过这个id进行请求时 直接读php文件
4. 查询缓存,和数据缓存差不多,根据查询语句进行缓存;
5. 常用的缓存技术有:redis和memcache
个人认为tp应该是全局缓存 因为:tp缓存实在本地生成一个php文件来存储数据库中读取出来的数据

strlen()与mb_strlen的作用与区别

在PHP中,strlen与mb_strlen是求字符串长度的函数

PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍(在 UTF-8编码下,一个汉字占3个字节)。

 

采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。


需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

写一个函数,尽可能高效的从一个标准url中取出扩展名

$arr = parse_url('http://www.sina.com.cn/abc/de/fg.php?id=1');

 

$result = pathinfo($arr['path']);var_dump($arr);

 

var_dump($result['extension']);

php.ini 中safe mod关闭 影响哪些函数和参数,至少写6个?

move_uploaded_file()        exec()

system()                              passthru()

popen()                              fopen()

mkdir()                               rmdir()

rename()                            unlink()

copy()                                 chgrp()

chown()                              chmod()

touch()                               symlink()

link()                                   parse_ini_file()

set_time_limit()                  max_execution_time mail()

一群猴子排成一圈,按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 の利点
(1) 実行時にモデルに対して複数のビューを同時に作成して使用できます。変更伝播メカニズムにより、関連するすべてのビューがモデル データの変更をタイムリーに受信できるようになり、関連するすべてのビューとコントローラーが同期して動作できるようになります。
(2) ビューとコントローラーの相互運用性により、ビューとコントローラーオブジェクトの置き換えが可能になり、必要に応じて動的に開いたり閉じたりすることができ、操作期間中でもオブジェクトが置き換えられます。 (3)モデルの移植性。モデルはビューから独立しているため、モデルを独立して移植して新しいプラットフォームで動作させることができます。必要なのは、新しいプラットフォーム上のビューとコントローラーに新たな変更を加えるだけです。 (4) 潜在的なフレーム構造。インターフェイスの設計だけでなく、このモデルに基づいてアプリケーション フレームワークを構築できます。
2. MVC のデメリット (1)
システムの構造と実装が複雑になります。単純なインターフェイスの場合、MVC に厳密に従ってモデル、ビュー、コントローラーを分離すると、構造が複雑になり、更新操作が多すぎて操作効率が低下する可能性があります。

ビューとコントローラー間の接続が強すぎます。ビューとコントローラーは互いに分離されたコンポーネントですが、実際には密接に関連しています。ビューにはコントローラーが存在しないため、その用途は非常に限定されており、その逆も同様であり、そのため独立した再利用が妨げられています。 (3) ビューによるモデル データへのアクセスが非効率的です。モデルの操作インターフェイスによっては、十分な表示データを取得するためにビューを複数回呼び出す必要がある場合があります。変更されていないデータへの不必要に頻繁なアクセスも、運用パフォーマンスに悪影響を及ぼします。 (4) 現在、一般に高度なインターフェイス ツールまたはコンストラクターは MVC モードをサポートしていません。これらのツールを MVC のニーズに合わせて調整し、個別のコンポーネントを作成するにはコストがかかるため、MVC の使用が困難になります。

セッション Cookie、セッションとの関係と違い(動作メカニズム)
違いとつながり:
Session
_start()を使用して
Session
を呼び出します。サーバーは
Session
IDのハッシュ値と
Session
の名前をデフォルト値のPHPSESSIDで生成すると同時に、

Session

ファイルを生成して送信します。クライアントへの送信変数は PHPSESSID(

セッション名) (デフォルト) 値は 128 ビットのハッシュ値です。サーバーは、この Cookie を通じてクライアントと対話します。Session 変数の値は、PHP によって内部的にシリアル化され、デフォルトで変数名が PHPSESSID であるクライアントのテキスト ファイルに格納されます。つまり、サーバーは http ヘッダーを自動的に送信します: header('Set-Cookie: Session_name()=Session_id(); path=/'); つまり、setcookie(Session

_name(),

) Session_id( )); このページから新しいページにジャンプして Session

_start() を呼び出すと、PHP は指定された ID に関連付けられているサーバー側に保存されている

Session データを確認し、見つからない場合は、新しいデータセットを作成します。 共有プラン: 1: Session/' target='_blank'>databaseを使用してSessionを保存し、サーバーがダウンしている場合でもデータベースを使用してSessionを保存します。大丈夫です、セッションはまだ残っています。 問題: プログラムをカスタマイズする必要があるため、リクエストごとにデータベースの読み取りと書き込みにコストがかかります。さらに、データベースのハッシュを実行すると、この問題を解決できます。 2:

Memcached

を使用してSessionを保存します。この方法はデータベースに似ており、メモリアクセスのパフォーマンスはデータベースよりもはるかに優れています。

問題: プログラムをカスタマイズする必要があるため、作業負荷が増加します。Memcached に保存されているデータをシリアル化する必要があるため、非効率であり、コンピューターの電源を切るか再起動するとデータが簡単に失われます。

3: 通过加密的cookie,在A服务器上登录,在用户的浏览器上添加加密的cookie,当用户访问B服务器时,检查有无Session,如果没有,就检验 Cookie是否有效,Cookie有效的话就在B服务器上重建Session。简单,高效, 服务器的压力减小了,因为Session数据不存在服务器磁盘上。根本就不会出现Session读取不到的问题。

问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送Session数据给服务器,Session中数据不能太多,浏览器对cookie 的大

小存在限制。不适合高访问量的情况,因为高访问量的情况下。

正则表达式

匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
匹配首尾空格的正则表达式:(^\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]*$

--------------------linux部分---------------------

core文件是什么,有什么用?

<span> core是unix系统的内核。当你的程序出现内存越界的时候,操作系统会中止你的进程,并将当前内存状态倒出到core文件中,以便进一步分析。程序员可以通过core文件来找出问题所在。它记录了程序挂掉时详细的状态描述。</span>
ログイン後にコピー
<span>什么是core dump Core的意思是内存, Dump的意思是扔出来, 堆出来。开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,它可以做为调试程序的参考.
    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。如何使用core文件 gdb -c core文件路径 [应用程序的路径],进去后输入where回车, 就可以显示程序在哪一行当掉的, 在哪个函数中.</span>
ログイン後にコピー
<span>为什么没有core文件生成呢? core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.</span>
ログイン後にコピー
<span>ulimit -c unlimited core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号</span>
ログイン後にコピー

不用core文件,程序出了问题产生信号是否知道?答:内核向进程发信号嘛。

共享内存除了文件映射还有什么方式?

共享内存对象映射。

二者有什么区别:

答:内存映射文件是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合于用来管理大文件。

请解释下列10个shell命令的用途
top、ps、mv、find、df、cat、chmod、chgrp、grep、wc

top:命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。 

ps:查看进程 

mv:移动或者更改文件 

find:在子目录中搜索匹配的文件 

df:linux中df命令参数功能:检查文件系统的磁盘空间占用情况。

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 (Giveユーザー、グループ、他のユーザーまたはグループが読み取りと書き込みの権限を設定すると、その権限は次のように表現されます: - 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の比較
Apacheに対するnginxの利点:
軽量、 Apache と比較して、メモリとリソースの使用量が少なくなります。高度にモジュール化された設計で、モジュールの作成は比較的簡単です
非同時実行性、nginx はリクエストを非同期かつノンブロッキングで処理し、複数の接続 (10,000 レベル) が 1 つのプロセスに対応できるのに対し、Apache はブロッキングかつ同期のマルチプロセス モデル、 1 つの接続が 1 つのプロセスに対応します。nginx は、低いリソース消費と高いパフォーマンスを維持できます。

Nginx の静的処理パフォーマンスは Apache

の 3 倍以上です。


2. Apache nginx に対する利点:
Apache の書き換えは nginx の書き換えよりも強力で、多くのモジュールがあり、基本的に考えられるものはすべて見つけることができ、比較的安定しており、モジュールの数が少ないです。バグがありますが、nginx には比較的多くのバグがあります

3: 理由: これは、Apache が伝統的なセレクトモデル。現在、Linux での大量の同時アクセスに耐えられる Squid と Memcached はすべて epoll ネットワーク I/O モデルを使用しています。 多数の接続の読み取りと書き込みを処理するために、Apache が採用する選択ネットワーク I/O モデルは非常に非効率的です。

cgi と fastcgi の違い

cgi は、2000 年以前には一般に静的なリクエストのみを処理していました。新しいプロセスをフォークして外部 C プログラム (または Perl スクリプトなど) を実行します。このプロセスは、処理されたデータを Web サーバーに返します。最終的に、Web サーバーはコンテンツをユーザーに送信します。 fork も終了します。 ユーザーが次回動的スクリプトの変更を要求すると、Web サーバーは再び新しいプロセスをフォークし、サイクルが継続します。

その後、より高度な方法が登場し、Web サーバーに Perl インタープリターまたは php インタープリターを組み込むことができます。 つまり、これらのインタープリタはモジュール化されており、Web サーバーは起動時にこれらのインタープリタを起動します。 新しい動的リクエストが受信されると、Web サーバーはこれらの Perl または php スクリプトを独自に解析するため、プロセスを再フォークする必要がなくなり、効率が向上します。

fastcgi のメソッドは、Web サーバーがリクエストを受信したときにプロセスを再フォークしません (このプロセスは Web サーバーの起動時に開始され、終了しないため) Web サーバーはコンテンツを This に直接渡します。プロセス (プロセス間通信 ただし、fastcgi は別の方法である tcp 通信を使用します)、このプロセスはリクエストを受信した後に処理し、結果を Web サーバーに返し、最後に終了せずに次のリクエストが到着するのを待ちます。 gFastcgi と CGI の違いは次のとおりです。


CGI データの処理プロセスに関して、パラメータの読み取りを処理する新しいプロセスをフォークして、リモート マシンまたはローカル マシン上のプロセスとの接続を確立する方法。 TCP ポートを開くには、
ループ に入り、データの到着を待ち、データを処理します


例: サーバーには 100,000 の単語があり、クライアントは毎回文字列を送信し、この文字列の前に付けられる単語の数を尋ねます。 その後、トライ ツリーを構築するプログラムを作成すると、ユーザーがリクエストするたびにこのトライ内で直接検索できるようになります。 しかし、CGI を使用すると、このリクエストの後にトライが失われ、次回プロセスが開始されるときに、新しいトライ ツリーを作成する必要があります。これはあまりにも非効率です。 fastcgi メソッドを使用すると、このレッスンのトライ ツリーはプロセスの開始時に確立され、後でトライ ツリー上の指定されたプレフィックスを直接クエリできます。

select、poll、epollの違い

select

selectは、1983年の4.2BSDで初めて登場しました。これは、select()システムコールを通じて複数のファイル記述子の配列を監視します。 () が返されると、配列内の準備ができた ファイル記述子 がカーネルによって変更され、プロセスが後続の読み取りおよび書き込み操作でこれらの ファイル記述子 を取得できるようになります。

select は現在、ほぼすべてのプラットフォームでサポートされており、その優れたクロスプラットフォーム サポートも利点の 1 つです。実際、これは今後も残る数少ない利点の 1 つです。

select の欠点の 1 つは、単一プロセスが監視できる ファイル記述子 の数に上限があることです (Linux では通常 1024 です)。ただし、この制限はマクロ定義を変更するか、マクロ定義を変更することで増やすことができます。カーネルを再コンパイルしても。

さらに、select() によって維持されるデータ構造には、多数の ファイル記述子 が格納され、 ファイル記述子 の数が増加するにつれて、そのコピーのオーバーヘッドも直線的に増加します。同時に、ネットワーク応答時間の遅延により、多数の TCP 接続が非アクティブになりますが、select() を呼び出すとすべてのソケットの線形スキャンが実行されるため、ある程度のオーバーヘッドも無駄になります。

poll

poll は、1986 年の System V Release 3 で誕生しました。本質的には select とあまり変わりませんが、poll には最大 ファイル記述子 制限がありません。

ポーリングと選択には、多数のファイル記述子を含む配列が、これらのファイル記述子の準備ができているかどうかに関係なく、ユーザーモードとカーネルのアドレス空間の間で全体としてコピーされるという欠点もあります。オーバーヘッドはファイル記述子の数に応じて直線的に増加します。

さらに、select() と poll() が準備ができた ファイル記述子 についてプロセスに伝えた後、プロセスがそのファイル記述子に対して IO 操作を実行しない場合、次回 select() と poll() が実行されます。一般的に準備完了メッセージが失われないように、これらの ファイル記述子を報告することをレベル トリガーといいます。

epoll

カーネルによって直接サポートされる実装方法、つまり、前述のほぼすべての利点を備え、Linux2 で最高のパフォーマンスとして認識されている epoll 実装方法が登場したのは、Linux2.6 になってからです。 6 マルチチャネル I/O 準備完了通知方法。

epoll は、レベルトリガーとエッジトリガー (エッジトリガー) の両方をサポートできます。これは、どのファイル記述子が準備完了したかをプロセスに通知するだけであり、それを一度だけ通知します。アクションを起こさないと、その後は通知されません。もう一度言いますが、この方法はエッジ トリガーと呼ばれます) 理論的には、エッジ トリガーの方がパフォーマンスが高くなりますが、コードの実装は非常に複雑です。

epoll は、準備ができた ファイル記述子 にのみ通知し、準備ができた ファイル記述子 を取得するために epoll_wait() を呼び出すと、返されるのは実際の記述子ではなく、準備ができた記述子の数を表す数値です。ここでは、epoll で指定された配列から対応する数の ファイル記述子 を取得するだけで済みます。これにより、システム内のこれらの ファイル記述子 の必要性が完全に排除されます。呼び出されたときにコピーします。

もう 1 つの重要な改善点は、epoll がイベントベースの準備完了通知メソッドを採用していることです。 select/poll では、カーネルは、プロセスが特定のメソッドを呼び出した後にのみ、監視されているすべてのファイル記述子をスキャンしますが、epoll は、記述子 の準備ができたときに、事前に epoll_ctl() を通じて ファイル記述子 を登録します。 、カーネルは、コールバックと同様のコールバック メカニズムを使用して、この ファイル記述子 を迅速にアクティブ化し、プロセスが epoll_wait() を呼び出したときに通知を受けます。

MemcacheとRedisの違い

  1. Redis では、すべてのデータが常にメモリに保存されるわけではありません。これが Memcached と比較した最大の違いです。
  2. Redis は多くの面でデータベースの特徴を備えており、つまりデータベース システムですが、Memcached は単なる単純な K/V キャッシュです。
  3. それらの拡張にはクラスタリングが必要です。実装方法: マスター/スレーブ、ハッシュ。
  4. 100kを超えるデータでは、MemcachedのパフォーマンスがRedisよりも優れています。
  5. メモリ使用効率について話して、単純なキーと値のストレージを使用する場合、Memcached はより高いメモリ使用率を持ちます。また、Redis が圧縮を組み合わせているため、キーと値のストレージにハッシュ構造を使用する場合は、メモリ使用率は Memcached よりも高くなります。もちろん、これはアプリケーションのシナリオとデータの特性によって異なります。
  6. データの永続性とデータの同期に関する要件がある場合は、Memcached にはこれら 2 つの機能がないため、Redis を選択することをお勧めします。システムのアップグレードまたは再起動後にキャッシュされたデータが失われないことを願うだけでも、Redis を選択するのが賢明です。
  7. 書き込みパフォーマンスの点では、Redis と Memcache に大きな違いはありませんが、読み取りパフォーマンス、特にバッチ読み取りパフォーマンスの点では Memcache の方が優れています。

以上、PHP インタビューの概要を内容も含めて紹介しましたが、PHP チュートリアルに興味のある友人の参考になれば幸いです。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート