導航:首頁 > 編程語言 > phpmysql隊列

phpmysql隊列

發布時間:2022-05-27 20:28:11

『壹』 php 怎麼做mysql的線程池

one-connection-per-thread
根據scheler_functions的模板,我們也可以列出one-connection-per-thread方式的幾個關鍵函數。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

static scheler_functions con_per_functions=

{ max_connection+1, // max_threads

NULL,

NULL,

NULL, // init

Init_new_connection_handler_thread, // init_new_connection_thread

create_thread_to_handle_connection, // add_connection

NULL, // thd_wait_begin

NULL, // thd_wait_end

NULL, // post_kill_notification

one_thread_per_connection_end, // end_thread

NULL // end

};

1.init_new_connection_handler_thread
這個介面比較簡單,主要是調用pthread_detach,將線程設置為detach狀態,線程結束後自動釋放所有資源。
2.create_thread_to_handle_connection
這個介面是處理新連接的介面,對於線程池而言,會從thread_id%group_size對應的group中獲取一個線程來處理,而one-connection-per-thread方式則會判斷是否有thread_cache可以使用,如果沒有則新建線程來處理。具體邏輯如下:
(1).判斷緩存的線程數是否使用完(比較blocked_pthread_count 和wake_pthread大小)
(2).若還有緩存線程,將thd加入waiting_thd_list的隊列,喚醒一個等待COND_thread_cache的線程
(3).若沒有,創建一個新的線程處理,線程的入口函數是do_handle_one_connection
(4).調用add_global_thread加入thd數組。
3.do_handle_one_connection
這個介面被create_thread_to_handle_connection調用,處理請求的主要實現介面。
(1).循環調用do_command,從socket中讀取網路包,並且解析執行;
(2). 當遠程客戶端發送關閉連接COMMAND(比如COM_QUIT,COM_SHUTDOWN)時,退出循環
(3).調用close_connection關閉連接(thd->disconnect());
(4).調用one_thread_per_connection_end函數,確認是否可以復用線程
(5).根據返回結果,確定退出工作線程還是繼續循環執行命令
4.one_thread_per_connection_end
判斷是否可以復用線程(thread_cache)的主要函數,邏輯如下:
(1).調用remove_global_thread,移除線程對應的thd實例
(2).調用block_until_new_connection判斷是否可以重用thread
(3).判斷緩存的線程是否超過閥值,若沒有,則blocked_pthread_count++;
(4).阻塞等待條件變數COND_thread_cache
(5).被喚醒後,表示有新的thd需要重用線程,將thd從waiting_thd_list中移除,使用thd初始化線程的thd->thread_stack
(6).調用add_global_thread加入thd數組。
(7).如果可以重用,返回false,否則返回ture

線程池與epoll
在引入線程池之前,server層只有一個監聽線程,負責監聽mysql埠和本地unixsocket的請求,對於每個新的連接,都會分配一個獨立線程來處理,因此監聽線程的任務比較輕松,mysql通過poll或select方式來實現IO的多路復用。引入線程池後,除了server層的監聽線程,每個group都有一個監聽線程負責監聽group內的所有連接socket的連接請求,工作線程不負責監聽,只處理請求。對於overscribe為1000的線程池設置,每個監聽線程需要監聽1000個socket的請求,監聽線程採用epoll方式來實現監聽。
Select,poll,epoll都是IO多路復用機制,IO多路復用通過一種機制,可以監聽多個fd(描述符),比如socket,一旦某個fd就緒(讀就緒或寫就緒),能夠通知程序進行相應的讀寫操作。epoll相對於select和poll有了很大的改進,首先epoll通過epoll_ctl函數注冊,注冊時,將所有fd拷貝進內核,只拷貝一次不需要重復拷貝,而每次調用poll或select時,都需要將fd集合從用戶空間拷貝到內核空間(epoll通過epoll_wait進行等待);其次,epoll為每個描述符指定了一個回調函數,當設備就緒時,喚醒等待者,通過回調函數將描述符加入到就緒鏈表,無需像select,poll方式採用輪詢方式;最後select默認只支持1024個fd,epoll則沒有限制,具體數字可以參考cat /proc/sys/fs/file-max的設置。epoll貫穿在線程池使用的過程中,下面我就epoll的創建,使用和銷毀生命周期來描述epoll在線程中是如何使用的。
線程池初始化,epoll通過epoll_create函數創建epoll文件描述符,實現函數是thread_group_init;
埠監聽線程監聽到請求後,創建socket,並創建THD和connection對象,放在對應的group隊列中;
工作線程獲取該connection對象時,若還未登錄,則進行登錄驗證
若socket還未注冊到epoll,則調用epoll_ctl進行注冊,注冊方式是EPOLL_CTL_ADD,並將connection對象放入epoll_event結構體中
若是老連接的請求,仍然需要調用epoll_ctl注冊,注冊方式是EPOLL_CTL_MOD
group內的監聽線程調用epoll_wait來監聽注冊的fd,epoll是一種同步IO方式,所以會進行等待
請求到來時,獲取epoll_event結構體中的connection,放入到group中的隊列
線程池銷毀時,調用thread_group_close將epoll關閉。
備註:
1.注冊在epoll的fd,若請求就緒,則將對應的event放入到events數組,並將該fd的事務類型清空,因此對於老的連接請求,依然需要調用epoll_ctl(pollfd, EPOLL_CTL_MOD, fd, &ev)來注冊。

線程池函數調用關系
(1)創建epoll
tp_init->thread_group_init->tp_set_threadpool_size->io_poll_create->epoll_create
(2)關閉epoll
tp_end->thread_group_close->thread_group_destroy->close(pollfd)
(3)關聯socket描述符
handle_event->start_io->io_poll_associate_fd->io_poll_start_read->epoll_ctl
(4)處理連接請求
handle_event->threadpool_process_request->do_command->dispatch_command->mysql_parse->mysql_execute_command
(5)工作線程空閑時
worker_main->get_event->pthread_cond_timedwait
等待thread_pool_idle_timeout後,退出。
(6)監聽epoll
worker_main->get_event->listener->io_poll_wait->epoll_wait
(7)埠監聽線程
main->mysqld_main->handle_connections_sockets->poll

one-connection-per-thread函數調用關系
(1) 工作線程等待請求
handle_one_connection->do_handle_one_connection->do_command->
my_net_read->net_read_packet->net_read_packet_header->net_read_raw_loop->
vio_read->vio_socket_io_wait->vio_io_wait->poll
備註:與線程池的工作線程有監聽線程幫助其監聽請求不同,one-connection-per-thread方式的工作線程在空閑時,會調用poll阻塞等待網路包過來;
而線程池的工作線程只需要專心處理請求即可,所以使用也更充分。
(2)埠監聽線程
與線程池的(7)相同

參考文檔
http://www.cnblogs.com/Anker/p/3265058.html
http://blog.csdn.net/zhanglu5227/article/details/7960677

『貳』 PHP+MYSQL 實現隊列 進行發送簡訊怎麼做

建議使用redis對列,不要使用mysql
把要發送的簡訊入隊。然後在php cli模式運行一個php出隊
例如:queue.php
<?php
while(1){
// 出隊處理
}
?>

『叄』 php消息隊列是用cli的嗎

伺服器一般是APACHE拉 開發一般在WIN32下進行 上傳以後虛擬機一般用linux的 因為linux對PHP的支持最好 速度較WIN32稍快 不過以後APACHE對WIN32的支持會變好的 官方說法
IIS也可以運行PHP不過我沒配置過 貌似linux+mysql+php+apache是最優秀的選擇 我也就隨大流了 用幾年了就沒換過配置!

『肆』 php處理mysql數據怎麼把多列合並成一列急

兩個方法
1,在sql語句里寫個CONCAT(b,c,d,e,f.....) as tt,然後php讀取tt就可以。
2,php循環輸出的時候定義個變數保存...

『伍』 php+mysql一個欄位中的數值如何分兩列排序顯示

循環時,用一個變數比如temp
輸出時判斷
temp=0
開始循環
<tr><td>
temp=temp+1
如果temp
除以2
=0
輸出</td></tr><tr><td>
否則
</td><td>最後輸出</td><tr>

『陸』 mysql 如何實現讀寫分離,用mysql-proxy 或者直接用php連接兩個資料庫

Mysql主從配置,實現讀寫分離
原理:主伺服器(Master)負責網站NonQuery操作,從伺服器負責Query操作,用戶可以根據網站功能模特性塊固定訪問Slave伺服器,或者自己寫個池或隊列,自由為請求分配從伺服器連接。主從伺服器利用MySQL的二進制日誌文件,實現數據同步。二進制日誌由主伺服器產生,從伺服器響應獲取同步資料庫。
具體實現:
1、在主從伺服器上都裝上MySQL資料庫,windows系統鄙人安裝的是mysql_5.5.25.msi版本,Ubuntu安裝的是mysql-5.6.22-linux-glibc2.5-i686.tar
windows安裝mysql就不談了,一般地球人都應該會。鄙人稍微說一下Ubuntu的MySQL安裝,我建議不要在線下載安裝,還是離線安裝的好。大家可以參考 http://www.linuxidc.com/Linux/2013-01/78716.htm 這位不知道大哥還是姐妹,寫的挺好按照這個就能裝上。在安裝的時候可能會出現幾種現象,大家可以參考解決一下:
(1)如果您不是使用root用戶登錄,建議 su - root 切換到Root用戶安裝,那就不用老是 sudo 了。
(2)存放解壓的mysql 文件夾,文件夾名字最好改成mysql
(3)在./support-files/mysql.server start 啟動MySQL的時候,可能會出現一個警告,中文意思是啟動服務運行讀文件時,忽略了my.cnf文件,那是因為my.cnf的文件許可權有問題,mysql會認為該文件有危險不會執行。但是mysql還會啟動成功,但如果下面配置從伺服器參數修改my.cnf文件的時候,你會發現文件改過了,但是重啟服務時,修改過後的配置沒有執行,而且您 list一下mysql的文件夾下會發現很多.my.cnf.swp等中間文件。這都是因為MySQL啟動時沒有讀取my.cnf的原因。這時只要將my.cnf的文件許可權改成my_new.cnf的許可權一樣就Ok,命令:chmod 644 my.cnf就Ok
(4)Ubuntu中修改文檔內容沒有Vim,最好把Vim 裝上,apt-get install vim,不然估計會抓狂。
這時候我相信MySQL應該安裝上去了。
2、配置Master主伺服器
(1)在Master MySQL上創建一個用戶『repl』,並允許其他Slave伺服器可以通過遠程訪問Master,通過該用戶讀取二進制日誌,實現數據同步。

『柒』 PHP用什麼來快速消費隊列

php變數的生命周期屬於頁面級,頁面訪問完變數就自動銷毀了。所以要實現多個php進程都可以使用的隊列,需要藉助第三方存儲系統。比如mysql、redis等,個人推薦redis,它本身裡面的鏈表類型資料庫就支持隊列,非常好用

『捌』 怎麼實現PHP調用MYSQL資料庫,實現數據橫排

你不要加那些DIV、UL、LI呀,只要有它們,肯定是豎排,比如下面這樣:

while($row=mysql_fetch_row($result))
{
echo "<a href='$row[2]' target='_blank'>$row[1]</a>";
}

或者使用TABLE,語句是:
echo '<table><tr>';
while($row=mysql_fetch_row($result))
{
echo "<td><a href='$row[2]' target='_blank'>$row[1]</a>";
}
echo '</table>';

『玖』 PHP 做任務隊列,現在常用的是哪個

生產環境用過 Gearman + Redis。

Gearman 用來做 worker 的調度,Redis 保存 workload。持久化用 MySQL 慢慢倒騰。
如對您有幫助,望採納,謝謝

『拾』 怎樣配置PHP讓它支持mysql

在PHP.ini中

找到 extension_dir = "./" (大約551行)
改為 extension_dir = "d:/php/ext"

找到;extension=php_mysql.dll (大約693行)
將';'去掉,改為
extension=php_mysql.dll

重啟apache服務
在Web根目錄下(如 E:\wwwroot)建立testdb.php文件內容如下:
<?php
$link=mysql_connect('localhost','root','123456');
if(!$link) echo "fail";
else echo "success";
mysql_close();
?>
用瀏覽器打開 http://localhost/testdb.php 如果輸出 success 就 OK 了

閱讀全文

與phpmysql隊列相關的資料

熱點內容
群體智能基本演算法 瀏覽:370
可編程軟體分為哪兩種 瀏覽:340
格林什麼app可以看 瀏覽:697
飛盧app仙俠熱賣推薦怎麼樣 瀏覽:722
飛秋上傳文件到共享文件夾 瀏覽:691
伺服器的共享文件夾如何訪問 瀏覽:232
復盛螺桿壓縮機講解 瀏覽:332
柱在基礎插筋需要加密嗎 瀏覽:80
51單片機中斷寄存器 瀏覽:65
壓縮文件後有病毒怎麼辦 瀏覽:618
蘋果ipad怎麼登安卓王者賬號 瀏覽:862
街頭足球伺服器已滿是什麼意思 瀏覽:462
androidspeex迴音消除 瀏覽:133
加密會議什麼意思 瀏覽:34
ubuntu命令行聯網 瀏覽:7
37選7中獎概率及演算法 瀏覽:593
加密狗哪個版本好 瀏覽:619
cisco命令手冊 瀏覽:502
omp演算法c 瀏覽:129
上海浦東機場源碼 瀏覽:885