App_php の例で一般的に使用されるインスタント配信関数を PHP がどのように実装するかを簡単に分析します。

WBOY
リリース: 2016-08-17 13:02:32
オリジナル
1123 人が閲覧しました

はじめに

私たちが普段 WeChat モーメントに投稿するとき、N 枚の写真がテキストと組み合わされて、手抜きなく瞬時に送信されることを想像してみてください。その体験はとてもクールに感じます~。

しかし、立ち止まって技術的に考えてみましょう。これは可能でしょうか?一部の 2G ネットワークでは、最大でも数十キロバイトの速度しかありません。圧縮されていても数百キロバイトの写真が、どのようにして瞬時に送信できるのでしょうか。

今考えると、ちょっと変じゃないですか〜

実際、多くのソーシャル ソフトウェア (Weibo、WeChat) はセカンド投稿メカニズムを使用しています。実際に送信してから送信に成功したことを通知するのではなく、送信に成功したことを直接通知し、その後バックグラウンドで送信した内容をこっそりアップロードするという現象がよく発生します。ネットワーク速度が良くないため、新しく送信されたモーメントは最初は正常でしたが、数分後に送信に失敗したというメッセージが表示されました。とても恥ずかしいことですが、最初は何も言わなかったのに、肝心なときに無理だと言われました

高度なテクノロジーに怯える必要はありません。これはほんの小さなトリックにすぎません。しかし、非常に実用的でもあります。

テクノロジーについて説明する前に、最初にいくつかの初期条件を述べます。

1. データベース テーブル構造にいくつかの特別な変更が加えられました。 友達のサークル コンテンツ テーブルには特別なフィールド ステータスがあり、値は 1 または 2 です。 値 1 は、友達のサークルが公開されていないことを意味します。 値 2 は、友達のサークルが公開されていることを意味します。 (なぜこれが行われるのか理解できない生徒は、先に読み続けてください。後で説明します)

2. この記事の二次投稿機能は、写真がある場合の使用を指します。写真がある場合、画像のアップロードが遅すぎるため、画像がない場合は二次投稿メカニズムを使用する必要があります。写真とテキストのみの場合は、テキストの送信量が非常に少ないため、通常の手順に従って送信する必要はありません。


3. この記事のコードは PhalApi フレームワークに基づいており、構文は ORM 操作の経験がある学生であれば理解できるはずです


4. この記事では、主に APP の 2 番目の送信機能について説明します。この機能は、Web 側では特に必要ありません。現在の PC では、一度に多くの写真を送信するのに十分です (10M/s、20M/s)。 )


実行プロセス全体について一般的に議論します:

クライアントは公開 API を呼び出し、サーバーはコンテンツ (

publish.php) を公開します。このアップロード API (upload) では、画像がある場合、クライアントは追加のアップロード API (upload.php) も呼び出します。 .php) 作業が完了する前に、クライアントはリリースが成功したことを直接伝えます (実際には、アップロードは現在完了していません。アップロードを必死に支援するプロセスが背後にあります)。あなたが送信したテキストと写真を一時的に結合して表示します (現在、あなただけがそれを見ることができ、あなたの友達サークルの他の人は見ることができません)。その後、アップロード API (upload. php)/ もちろん、アップロードはタイムアウトする可能性があります (通常は 1 分以内に結果が表示されます)。失敗した場合は 1 分以内に送信失敗が報告されます。結果を待っていると、アップロードが失敗しない限り、後で通知されます。

それでは、このメカニズムを技術レベルで分析してみましょう:

右上隅の送信ボタンをクリックすると、2 つのプロセスが同時に開始され、そのうちの 1 つはテキストのアップロードを支援し、テキストが正常に送信されたことを通知します (

publish.php)。もう 1 つのプロセスは、送信した画像 (upload.php) を秘密裏にアップロードすることです。具体的なコードは次のとおりです。

Publish.php

リーリー

その謎を見ましたか?データベースに入力された
status

フィールドに基づいて 1 (未公開) と 2 (公開) の 2 つの状況があり、データ (list.php) を読み取るときはどうすればよいでしょうか。 表示ページは次のようになります:

Lists.php

リーリー

此处的where条件是秒发机制的最关键的地方:

status大于1(已发表)或者等于1(未发布),(tipsstatus在有图片的情况下默认值为1)但是属于当前用户发布的内容,都可以读出来,这就有一个很奇妙的现象,就是无论如何,我们自己发的朋友圈,自己永远是可以读出来的,但是其他人就不一定了(因为如果有图片的话,还需要去调用另外一个进程上传图片,然后在那个进程将status改为2)

那么还有最后一个关键点,就是负责上传图片的那个进程(upload.php),这个是真实上传图片的逻辑,

有几张图片,这么upload.php就会被调用几次

每次上传成功后将图片行的字段status改成2

upload.php

<&#63;php
 
//Code..
 
//把图片上传到服务器目录
 
//获取长传结果标识,更改状态
 
If(上传成功){
 
//将status改回2
 
$status_data = array("status" => 2);
 
DI()->notorm->pic->select('u_id')->where('u_id, $u_id)-->update($status_data);
 
}else{
 
Code…
 
}
ログイン後にコピー

经过以上的几个操作(首先是publish.php,如果有图片上传的话则调用upload.php,展示的时候是list.php)。

不知道大家看出门道没有,和我们平常写的发布功能不同的是,上传upload.php功能被独立出来了,改装后的发布publish.php会用最快的速度将你的文本内容存进数据库,并且如果有图片内容的话,他会单独调用上传API upload.php

最关键的是在显示的时候做了一些小技巧,让自己保证可以看到自己发的东西。

好了,以上就是本文的全部内容了,希望对大家学习PHP有所帮助,也请大家继续关注脚本之家。

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