PHP7中用opcache.file_cache導出腳本opcode實現源代碼保護
http://my.oschina.net/eechen/blog/539995
下載PHPDroid: 基於WebView和PHP內置HTTP服務器開發Android應用
http://my.oschina.net/eechen/blog/655689
截圖是我在Ubuntu上用arm-none-linux-gnueabi-gcc交叉編譯的Android版PHP(靜態連接glibc等庫).
adb push ./php /data/local/tmp 上傳到Android系統(小米4),直接 ./php -S 127.0.0.1:8181 跑Web服務.
套個WebView就能用PHP(內置Web服務器和SQLite引擎)寫Android應用了.
生成的php用arm-none-linux-gnueabi-strip去掉符號表,zip壓縮後約5MB.
少用些圖片,整個應用作到8MB之內應該沒什麼問題.
http://my.oschina.net/eechen/blog/298027
HHVM和PHP7都已經發出來了,還有具體的編譯打包方法,能夠自行按照教程構建出Nginx/Apache/MySQL,至於Android版PHP的交叉編譯構建,參考的是DroidPHP的方法.
個人Android App也基本寫好了,已經跑在個人小米4上了.
過程就是把/data/app/net.php.phpdroid.apk/assets/php/複製到/data/data/net.php.phpdroid/php/,
而後Java exec調用/system/bin/sh執行命令,先給php/bin/start.sh賦予執行權限,而後執行start.sh,
start.sh裏給php/bin/php賦予執行權限,而後調用php生成用於標記WebView的UserAgent的隨機串php/bin/ua,
並調用php的fsockopen從8181開始在127.0.0.2上找到可用的端口php/bin/port,
而後啓動PHP的HTTP服務器,而後用echo $! > php/bin/pid記錄PHP的PID,
start.sh執行完後回到Java主程序,主程序讀取UserAgent(php/bin/ua)並setUserAgentString和
讀取端口(php/bin/port)並loadUrl,從而打開WebView並訪問本地PHP.
退出關閉的時候則執行stop.sh調用kill殺死php/bin/pid.
start.sh的開頭也執行一次stop.sh,關掉可能沒有被殺死的舊進程.
補充一下User Agent驗證的說明:
/data/data/net.php.phpdroid/php/bin/php \
-c /data/data/net.php.phpdroid/php/bin/php.ini \
-S 127.0.0.2:8181 \
-t /data/data/net.php.phpdroid/www \
/data/data/net.php.phpdroid/php/auth.php
其中auth.php是PHP內置的HTTP服務器的特性,就是每一個請求都會通過auth.php處理.
名字不要求是auth.php,能夠隨意取,加到php啓動參數裏就能生效.
https://wiki.php.net/rfc/builtinwebserver
<?php
//return false;
$ua = file_get_contents(dirname(__FILE__).'/ua');
if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']===$ua) return false;
else exit('Auth Failed');
代碼意思就是若是客戶端User Agent不是/data/data/net.php.phpdroid/bin/ua,則拒絕訪問.
等我整理好,我會把這些資源全都放出來,授人以魚也應該授人以漁,
這些知識都是從網絡上得到的,若是每一個人都藏着掖着,那我也不會捕魚,
正是由於有的人樂於分享,知識才得以普遍傳播.
像patchelf便攜式打包參考的就是百度技術博客的分享:
http://lamp.baidu.com/2014/10/17/gou-jian-ke-sui-di-bu-shu-de-lampji-chu-huan-jing-bao/
構建Android版PHP參考的則是DroidPHP的分享:
https://github.com/DroidPHP/DroidPHP/blob/master/docs/Compiling.md
Linux上,用tar.xz打包GCC -O3編譯的php7cli(3MB)和依賴庫php7libs(7MB),大小約10MB.
由於打包了依賴庫,因此能作到解壓即用,適配全部Linux發行版.
整個應用打包下來,能夠作到不超過15MB.
若是源代碼不想被別人看到,PHP7支持用opcache.file_cache導出腳本opcode實現源代碼保護,詳情看:
http://my.oschina.net/eechen/blog/539995
我打包了適用於64位Linux的PHP7:
http://my.oschina.net/eechen/blog/411534
去掉裏面的PHP-FPM和PHP-CGI,保留PHP CLI,整個PHP7環境就是10MB左右了.
假設應用安裝在/png/php/7.0.0,其下的www做爲根目錄,啓動HTTP服務:
/png/php/7.0.0/bin/php -S localhost:9393 -t /png/php/7.0.0/www
瀏覽器作界面,訪問localhost:9393打開應用.
這兩個步驟能夠作成一個啓動腳本start.sh:
#!/bin/bash
nohup /png/php/7.0.0/bin/php -S localhost:9393 -t /png/php/7.0.0/www >/dev/null 2>&1 &
nohup xdg-open http://localhost:9393/ >/dev/null 2>&1 &
關閉腳本stop.php就更簡單了,調用kill關閉PHP CLI進程便可:
<?php
shell_exec('kill '.getmypid());
好比PHP調用系統自帶命令lshw或者讀取/proc/cpuinfo就能拿到各類硬件信息,包括CPU的即時運行頻率等.
PHP能夠把命令返回的信息直接寫在<pre></pre>,或者轉爲數組進行精確的哈希操做後輸出.
這樣,像 雅黑探針 那樣,經過Web界面就能獲取像Windows上CPU-Z工具的硬件信息.
Linux"一切皆文件"的思想方便PHP獲取系統信息開發Linux桌面應用.
/proc和/sys這兩個文件系統裏包含了Linux的各類運行時信息和硬件信息.
經過man proc查查每項的說明,任何語言都能以文本形式訪問裏面的數據,好比PHP獲取內存使用信息:
<?php
$arr = explode("\n", file_get_contents('/proc/meminfo'));
foreach($arr as $k => $v) {
if(!empty($v)) {
$tmp = explode(':', $v);
$new[trim($tmp[0])] = trim($tmp[1]);
}
}
echo 'MemTotal: '.$new['MemTotal']."\n";
echo 'MemFree: '.$new['MemFree']."\n";
echo 'Buffers: '.$new['Buffers']."\n";
echo 'Cached: '.$new['Cached']."\n";
echo 'SwapCached: '.$new['SwapCached']."\n";
本地存儲用SQLite,瀏覽器跟本地和服務器交互能夠用AJAX或者WebSocket(Swoole),
程序更新時pclose(popen('upgrade.php', 'r'))打開一個CLI進程用file_get_contents()或者curl獲取更新包.
進程間能夠經過文件系統標記或者SQLite數據庫進行通訊.
CodeSourcery基於GNU GCC改造的交叉編譯器 arm-none-linux-gnueabi 編譯的程序能兼容多種ARM架構.
在Linux上把PHP移植到Android上運行的DroidPHP項目就用到了 arm-none-linux-gnueabi-gcc 這個交叉編譯器:
https://github.com/DroidPHP/DroidPHP/blob/master/docs/Compiling.md
把PHP部署到客戶端Android,WebView作界面,這樣用網站開發技術HTML/CSS/JS/PHP/SQL就可以開發Android應用.
DroidPHP編譯教程裏面有一些小錯誤,好比:
LDFLAGS="-static -I$ROOTFS/lib -L$ROOTFS/usr/lib" \
應該改成:
LDFLAGS="-static -L$ROOTFS/lib -L$ROOTFS/usr/lib" \
還有應該使用arm-none-linux-gnueabi的頭文件,好比:
mv /png/dev/android/glibc/usr/include /png/dev/android/glibc/usr/include_backup
ln -s /png/dev/android/arm-2014.05/arm-none-linux-gnueabi/libc/usr/include /png/dev/android/glibc/usr
由於PHP默認調用/bin/sh來執行命令,而Android上沒有/bin/sh,只有/system/bin/sh.
因此交叉編譯前須要把/bin/sh該爲/system/bin/sh:
sed -i "s{/bin/sh{/system/bin/sh{" ext/standard/proc_open.cphp