成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PPython:PHP擁抱Python的利器

開發 后端
在 PHP 中調用 Python 實現某些處理,這種需求雖然比較小眾,還是實用的。目前網上可以查到很多資料仍在探討 exec()(也包括 system()、shell_exec()、passthru() 等)執行外部的 Python 文件,但這只是一種通用的方式,調用成本比較高,在每次調用時,需要裝載整個 Python 解釋環境。

[[265261]]

介紹

Python 與 PHP 都是廣泛使用的語言,各有所長,讓人期待兩者結合可以實現更豐富的效果。

在 PHP 中調用 Python 實現某些處理,這種需求雖然比較小眾,還是實用的。目前網上可以查到很多資料仍在探討 exec()(也包括 system()shell_exec()passthru() 等)執行外部的 Python 文件,但這只是一種通用的方式,調用成本比較高,在每次調用時,需要裝載整個 Python 解釋環境。

有此類需求的開發者非常適合看一下 PPython,這是一種從根本上將 PHP 與 Python 有效結合的技術。

PPython 最初見于 https://code.google.com/p/ppython,該作者將 lajp(一種 PHP 結合 Java 的技術)移植到了 Python 上。

該項目最初建立于 2012 年,而且似乎已經停止維護多年,不過目前來看其思路及效果還是值得肯定的,因此將此項目從停止運營的 Google Code 上遷移到了 GitHub,并遵循原 Apache 許可證重新發布和維護。

日前筆者對此作了一番嘗試,對 PPython 的方便易用有所體會。

原理與架構

PHP 與 Python 通訊有兩種不同的套接字機制:TCP 套接字和 UNIX 套接字。UNIX 套接字是 Unix/Linux 本地套接字,相對于 TCP 套接字,具有以下特點:

  • 只能在同一臺主機中通訊(IPC),不能跨主機;
  • 傳輸速度大于 TCP 套接字;
  • 服務端只向本機提供服務(沒有對外偵聽端口),相對安全,易于管理。

PHP 和 Python 各有其語言內部定義的數據類型,通常 PHP 進程與 Python 進程進行數據交互時,需要進行轉碼處理。此類轉換如由應用自行實現,從開發效率到運行性能都會增加不少額外負擔。

PPython 對 PHP 和 Python 間的通訊方式的處理支持 TCP 套接字和 UNIX 套接字兩種機制,兼顧通訊效率和分布式,轉碼由服務統一處理,Python 為 PHP 的數據類型提供格式兼容,使 PHP 端開發無須為底層通訊擔心。

Python 因其語言 GIL 特性,同一進程內多線程效率不高。PPython 可根據項目需要部署服務,多進程運行 Python,提高應用綜合性能。

使用方法

PPython 的代碼可從上述項目倉庫中下載。

下載得到的文件中,以下三個是 PPython 的核心代碼,作用如下:

  • php_python.py,Python 進程主文件,完成 Python 端監聽請求并運行返回
  • process.py,Python 端核心類,實現 Python 內部進程調用及 PHP 與 Python 數據結構轉化等關鍵處理
  • php_python.php,PPython 客戶端,PHP 端引用此文件,可直接使用 PPython 函數實現調用。

將以上文件放置到任意目錄。先修改準備運行 PPython 的端口,監聽端口不限,只要 php_python.pyphp_python.php 兩端修改一致。筆者統一改為 10240。

在當前目錄下運行 php_python.py,只要 Python 環境正常,便將運行起一個 PPython 的服務。

  1. -------------------------------------------
  2. - PPython Service
  3. - Time: 2019-05-13 22:24:09
  4. -------------------------------------------
  5. Listen port: 10240
  6. charset: utf-8
  7. Server startup...

PHP 端引入 php_python.php,就可以用 ppython 函數與之前啟動的 PPython 服務通訊,傳入請求由 PPython 服務調用 Python 處理后返回結果,如 $res = ppython('test::go') 是調用test.py 中的 go 函數,也可加上更多參數,第二個參數起將為被調的函數傳遞更多參數。

php_python.py 是 PPython 啟動后直接運行的全局代碼,有全局配置或進程啟動后的通用處理都寫在這里,如原生代碼中建立了數據庫連接等,項目中應視情況作優化。

但 Python 令人感興趣的主要方面不只是像 PHP 那樣描述業務功能,它可以在人工智能等領域所需要的計算型任務提供對更復雜的數據結構的處理,因此二者的結合可以給 PHP 帶來更多應用場景。

改進

此外,原生的 php_python.py 還有些不足。筆者用 ppython 調用自定義代碼中遇到了三個問題,并相應做了解決:

  1. 不支持 complex(復數類),復數是數學上的一種數據類型,主要包括 real(實部)和 imag(虛部)數據,雖然日常生活中遇到較少,但 AI 和各種專業研究領域或并不罕見。Python 里有 complex 類,對復數可以直接進行各種計算,但 PPython 序列化和反序列化對 complex 沒有處理。為了能讓 complex 包括的數據能正常返回,只要在 process.pyz_encode() 方法中加上符合 PHP 要求的序列化處理,代碼如下:

    1. elif isinstance(p, numpy.complex128):
    2. t1 = str(p.real)
    3. t2 = str(p.imag)
    4. return 'O:7:"complex":2:{s:4:"real";d:%s;s:4:"imag";d:%s;}' % (t1,t2)
  2. 不支持 ndarray(多維數組)。相比 complexndarray 要普通得多,相信凡使用到 Python 的各種計算功能,ndarray 是無法回避的,甚至 ndarray 在一定程度上成就了 Python。但原 php_python.py 不能識別 ndarray。不過解決起來并不難,在 process.py 里找到z_encode() 方法,加上下面這段,可以直接將 ndarray 轉化為符合 PHP 要求的數組(數字索引)。 

    1. elif isinstance(p, numpy.ndarray):
    2. s = ''
    3. i = 0
    4. for d in p:
    5. s += 'i:%d;%s' % (i,z_encode(d))
    6. i += 1
    7. return "a:%d:{%s}" % (len(p),s)
  3. 原代碼不太穩健,如數據為 ndarray 類型,if p == None:報錯ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(),因為p == None的結果也是ndarray,不返回false ,將判斷方法改為if p is None:可避免出錯。

    相應地 PHP 端也要注意一下序列化和反序列化的處理。

處理回復中類似 complex 這樣的對象數據時,如系統中沒有定義相應的類,PHP 是可以反序列化的,但將顯示為 “incomplete object”,vardump 看得到 realimag 數據,但不能直接操作,自行定義 complex 類后,則按指定的類進行解析,與 PHP 內的一般對象無異,可以輕松進行所有操作。

至此,PHP 與 Python 的功能調訊已無問題。

補充:注冊為服務

命令行下啟動 php_python.py 主要是方便調試,可以看到觀察反饋信息等,生產環境中手工啟動 PPython 畢竟不太方便。可以將 PPython 配置成服務,修改端口也可以為不同的應用配置不同的 PPython 端。

Linux 下將一個進程注冊為服務很簡單,只要建立 /usr/lib/systemd/system/ppython.service,內容如下:

  1. [Unit]
  2. Description=PHP-Python Service
  3. After=network.target remote-fs.target nss-lookup.target
  4. [Service]
  5. ExecStart={PPYTHON_PATH}/php_python.py
  6.  
  7. [Install]
  8. WantedBy=multi-user.target

其中 {PPYTHON_PATH} 要改成實際路徑。

總結

有了 PPython,可以摒棄 exec() 這種 shell 調用,使開發回歸到邏輯本身。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2023-12-31 19:41:04

PHP性能終端

2010-10-22 14:43:09

移動開發

2011-02-15 10:05:48

PHPPHPUnit

2009-10-14 08:32:14

Windows 7PHP高校IT

2011-02-16 09:45:13

PHPPHPUnit

2021-04-15 11:05:07

Croc命令Linux

2011-02-21 09:54:14

PHPPHPUnit

2021-08-24 23:23:35

Python工具開發

2023-10-16 16:05:44

PythonPyCharm編程語言

2011-04-01 09:11:14

Python

2020-04-01 16:10:02

PythonAPScheduler調度

2020-07-01 14:09:06

物聯網智能人工智能

2024-05-21 09:52:19

2023-12-19 08:09:06

Python定時任務Cron表達式

2023-03-27 13:25:18

WebAssembl語言Scheme

2021-05-28 23:04:23

Python利器執行

2023-09-25 13:07:27

2017-08-01 17:06:34

AWS云計算云超能

2021-06-04 11:00:48

文件傳輸Croc工具

2024-01-05 07:35:55

Pythonos 模塊工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区在线观看 | 欧美日产国产成人免费图片 | 亚洲欧洲一区 | 99九九久久 | 精品国产视频 | 在线免费黄色小视频 | 国产精品区一区二区三区 | 中国黄色在线视频 | 中文字字幕在线中文乱码范文 | 日本人做爰大片免费观看一老师 | 亚洲视频二区 | 九九亚洲精品 | 久久这里有精品 | 日韩一区二区在线免费观看 | 一本一道久久a久久精品蜜桃 | 欧美aⅴ| 欧美精品影院 | 国产极品91| 国产一区二区在线视频 | 亚洲欧洲在线观看视频 | 91麻豆精品国产91久久久久久 | 国产成人久久精品一区二区三区 | 国内精品视频一区二区三区 | 国产japanhdxxxx麻豆 | 精品国产网| 91不卡| 亚洲一区免费 | 你懂的国产 | 国产美女精品视频免费观看 | 91精品国产一区二区三区动漫 | 中文字幕高清免费日韩视频在线 | 日本不卡免费新一二三区 | 毛片免费观看视频 | 成人超碰在线 | 亚洲444eee在线观看 | 成人亚洲精品 | 一区二区影院 | 久久视频一区 | 国产91久久久久蜜臀青青天草二 | 中文字幕第一页在线 | 在线观看视频h |