本文目錄一覽:
php如何實現腳本異步執行的方法具體分析
php語言得用fsockopen()函數,實現腳本異步運行,代碼如下
異步請求函數(用debug參數若為true則為用為調試,開啟調試可以看到異步的執行情況,但是失去異步的效果)
main.php
?php
/**
* 異步請求
* @copyright Copyright (c) Hangzhou Technology Co.,Ltd. ()
* @author $Author: juny $
* @version $Id: main.php 332 2018-09-23 09:15:08Z juny $
*/
function request_by_fsockopen($url,$post_data=array(),$debug=false){
$url_array = parse_url($url);
$hostname = $url_array[‘host’];
$port = isset($url_array[‘port’])? $url_array[‘port’] : 80;
@$requestPath = $url_array[‘path’] .”?”. $url_array[‘query’];
$fp = fsockopen($hostname, $port, $errno, $errstr, 10);
if (!$fp) {
echo “$errstr ($errno)”;
return false;
}
$method = “GET”;
if(!empty($post_data)){
$method = “POST”;
}
$header = “$method $requestPath HTTP/1.1\r\n”;
$header.=”Host: $hostname\r\n”;
if(!empty($post_data)){
$_post = strval(NULL);
foreach($post_data as $k = $v){
$_post[]= $k.”=”.urlencode($v);//必須做url轉碼以防模擬post提交的數據中有符而導致post參數鍵值對紊亂
}
$_post = implode(”, $_post);
$header .= “Content-Type: application/x-www-form-urlencoded\r\n”;//POST數據
$header .= “Content-Length: “. strlen($_post) .”\r\n”;//POST數據的長度
$header.=”Connection: Close\r\n\r\n”;//長連接關閉
$header .= $_post; //傳遞POST數據
}else{
$header.=”Connection: Close\r\n\r\n”;//長連接關閉
}
fwrite($fp, $header);
//—————–調試代碼區間—————–
//注如果開啟下面的注釋,異步將不生效可是方便調試
if($debug){
$html = ”;
while (!feof($fp)) {
$html.=fgets($fp);
}
echo $html;
}
//—————–調試代碼區間—————–
fclose($fp);
}
$data=array(‘name’=’guoyu’,’pwd’=’123456′);
$url=”;
request_by_fsockopen($url,$data,true);//
other.php
?php
header(“content-type:text/html;charset=utf-8”);
//error_reporting(0);
//ini_set(‘html_errors’,false);
//ini_set(‘display_errors’,false);
$name = isset($_POST[‘name’])?$_POST[‘name’]:”;
$pwd = isset($_POST[‘pwd’])?$_POST[‘pwd’]:”;
echo $name.$pwd;
echo ‘success ok’;
die;
?
使用實例:
[運行的main.php主腳本文件]
$data=array(‘name’=’guoyu’,’pwd’=’123456′);
$url=”;
request_by_fsockopen($url,$data,true);//把應用B的用戶表異步-同步數據
[導步執行文件other.php]
在other.php中便可以用$_POST接收main.php提交過來的參數,從而進行下一步操作
以上就是php如何實現腳本異步執行的方法具體分析的詳細內容.
PHP變量的底層實現
我們解壓PHP的源碼包, 看到如下的目錄
其中,
最核心的—Zend目錄, 這是zend虛擬的實現. 包括棧,數據類型,編譯器等,都在這實現.
最主要的main –PHP的一些內建函數,最主要函數都在這裡放着.
最大的一個目錄ext — PHP的擴展.
PHP的大部分功能,都是以extenstion形式來完成的.
如果你開發了一個擴展,也放在ext目錄下.
Zend對變量的表示:
答: zend實現了 zval結構體
{
value: [聯合體] ,聯合體的內容可能是C語言中的long,double,hashtable…
type:變量類型 , IS_NULL,IS_BOOL,IS_STRING…… IS_RESOURCE
refcount_gc
is_ref_gc
}
如:
$a = 3;
{
value : [long lval = 3]
type: IS_LONG
}
$a = 3.5
{
value: [double dval = 3.5]
type:IS_DOUBLE
疑問:
PHP中有8種數據類型,為什麼zval-value 聯合體中,只有5種?
答:
1: NULL,直接 zval-type = IS_NULL,就可以表示,不必設置 value的值.
2: BOOL型 , zval-type = IS_BOOL, 再設置 zval.value.lval = 1/0;
3: Resourc型 ,資源型 往往是服務器上打開的一個接口,如果 文件讀取接口.
zval-type = IS_RESOURCE, zval-tyoe.lval =服務器上打開的接口的編號
發現:
PHP中,字符串類型,長度是已經緩存的,調用strlen時,系統可以直接返回其長度,不必計算.
php手把手教你做網站(二十九)thinkphp6部署多個數據庫
前邊介紹了負載均衡,mysql同步,接下來介紹tp6分佈式部署多個數據庫,實現讀寫分離。
tp6的分佈式部署讀和寫仍然是一個系統,這裡我們分開操作,給用戶展示的就是從數據庫,後端添加文章就是主庫,然後同步到從庫。
1、配置數據庫鏈接參數
目標:實現隨機使用數據庫展示信息,只是讀操作。
測試:前台可以讀取表中內容(存放的不一致),查看是否是隨機顯示的。
打開.env文件進行編輯
說明:
2、編輯database.php
找到deploy設置為1分佈式部署,下邊不要改,都是讀,寫入的也就是後端的我們單獨建站連接主庫。
配置完成,tp6使用的是mt_rand取隨機數判斷使用哪個數據庫。
3、數據庫交互寫操作
比如瀏覽量沒必要每次都去更新數據庫,可以先使用redis緩存,存夠1000的整數倍,再去更新數據庫。
4、後台獨立,也就是寫
可以前後端分離,單獨做一個網站(沒有前端)使用ip訪問或者獨立的域名連接後台。
5、上傳附件(jquery ajax跨域上傳)
使用了nginx負載均衡,肯定是多個一樣的網站,如果圖片存放到一個站,別的就不能訪問了,可以單獨設置一個附件(壓縮包,圖片等)服務器,可以使用二級域名連接,這就要求我們上傳附件的時候,是上傳到附件服務器。
jqueryURL
API控制器apdpic方法
說明:
也可以先傳到後台服務器然後使用(php)ftp上傳,或者是通過curl上傳到附件服務器,感覺那樣畢竟麻煩,直接設置跨域會比較簡單。
也測試了使用jsonp跨域,但是不能上傳附件。
6、thinkphp6實現讀寫分離(在一個站點)
我個人是不喜歡這樣的,負載均衡應該是均衡地讀,也就是前台單獨一個站點,後端的寫是另一個獨立的站點,看個人喜好吧。
獨立後台的優點:可以提升安全性,因為我們的後台網址是不公開的,避免用戶猜測一些後台的信息。
.env配置按照1所述編輯,默認第一個是主庫。
database.php
願大家在新的一年心想事成,萬事如意!!!
PHP實現定時任務的幾種方式
一. 簡單
?php
ignore_user_abort();//關掉瀏覽器,PHP腳本也可以繼續執行.
set_time_limit(0);// 通過set_time_limit(0)可以讓程序無限制的執行下去
ini_set(‘memory_limit’,’512M’); // 設置內存限制
$interval=60*30;// 每隔半小時運行
do{
//ToDo
sleep($interval);// 等待5分鐘
}
while(true);
二. 簡單 可控型
config.php
?php
return 1;
?
cron.php
ignore_user_abort();//關掉瀏覽器,PHP腳本也可以繼續執行.
set_time_limit(0);// 通過set_time_limit(0)可以讓程序無限制的執行下去
$interval=60*30;// 每隔半小時運行
do{
$run = include ‘config.php’;
if(!$run) die(‘process abort’);
//ToDo
sleep($interval);// 等待5分鐘
}
while(true);
三. 簡單 改進型
?php
$time=15;
$url=”http://”.$_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’];
/*
function
*/
sleep($time);
file_get_contents($url);
?
原創文章,作者:WJGX,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/132811.html