php容器
Ⅰ docer中nginx關聯php的時候說找不著php容器,請問大佬們這是哪個配置有問題
上圖
提問不上圖 你覺得你就能把問題描述清楚?
說再多都是浪費時間
希望可以幫助你 請採納 謝謝
Ⅱ tomcat,php,apache都是什麼關系
這么說吧
PHP是一門語言 腳本語言(你現在的網路頁面其實也是PHP做的)
APACHE是一個專門執行PHP的容器 你可以想成 PHP在apache裡面才能跑起來
TOMCAT是APACHE的一個「擴展」 用來支持JSP的(PHP也需要一個APACHEA擴展)
打個比方:Apache是一輛卡車,上面可以裝一些東西如html等。但是不能裝水,要裝水必須要有容器(桶),Tomcat就是一個桶(裝像Java這樣的水),而這個桶也可以不放在卡車
除此之外 網站程序還有:
ASP
ASPX
HTML...
網站容器還有:
IIS
LIGHTHTTP
nginx
....
Ⅲ PHP 根據判斷大容器的width,輸入小容器
如果你這個寬度是按照客戶端的來調整的話這個在PHP里是沒法做的.你只能變通到其他的方法.
用JS動態調整每個LI的寬度可以做到.
當你的大窗口是750的時候,你可以把該容器下的class設定為li1
.li1{width:275px; margin:1px;}
.li2{width:180px;margin:1px;}
在PHP里你的LI是一直下支的.
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
JS判斷出大容器的寬度後就會對LI進行自動調整,就能夠自適應顯示了.
思路就是這樣,實現也不難.
Ⅳ 如何在docker容器裏手動重啟php
include <QtCore/QCoreApplication>
#include <QAxObject>
#include <Windows.h>
int main(int argc, char *argv[])
{
//OleInitialize(0);
//CoInitialize(0);
QCoreApplication a(argc, argv);
QAxObject *asdfg = new QAxObject("Excel.Application");
return a.exec();
}
Ⅳ docker 怎麼啟動php容器
這是最簡單的架構方式,在 Docker 發展早期,Docker 被大量的濫用,比如,一個鏡像內啟動多服務,日誌收集依舊是按照 Syslog 或者別的老方式,鏡像容量非常龐大,基礎鏡像就能達到 80M,這和 Docker 當初提出的思想完全南轅北轍了,而 Alpine linux 發行版作為一個輕量級 Linux 環境,就非常適合作為 Docker 基礎鏡像,Docker 官方也推薦使用 Alpine 而不是 Debian 作為基礎鏡像,未來大量的現有官方鏡像也將會遷移到 Alpine 上。本文所有鏡像都將以 Alpine 作為基礎鏡像。
Ⅵ docker php 怎麼這么大
步驟:
1、 在安裝好php環境的容器,參考上面貼出的鏈接那篇文章的部分,做好基礎工作:
#創建工作目錄
mkdir /rootfs
#進入工作目錄
cd /rootfs
#創建基礎目錄
mkdir -p bin etc lib proc sys tmp dev/pts usr/lib64 usr/bin usr/local/bin
#創建一個空的DNS服務用的文件
touch etc/resolv.conf
#復制名稱解析文件
cp /etc/nsswitch.conf etc/nsswitch.conf
#創建用戶和用戶組文件
echo root:x:0:0:root:/:/bin/sh > etc/passwd
echo root:x:0: > etc/group
#創建php程序運行的用戶
echo www:x:1001:1001:root:/:/bin/sh >> etc/passwd
echo www:x:1001: >> etc/group
#依賴庫軟鏈接
ln -s lib lib64
#工具軟鏈接
ln -s bin sbin
#下載busybox,若網速慢可以用迅雷下載,然後復制到/sbin/busybox
curl -o /sbin/busybox http://busybox.net/downloads/binaries/1.21.1/busybox-x86_64
#加許可權
chmod +x /sbin/busybox
#安裝busybox
cp /sbin/busybox bin
busybox --install -s bin
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
26
27
28
29
30
31
32
33
34
35
36
37
38
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
26
27
28
29
30
31
32
33
34
35
36
37
38
2、找依賴,假設我的php安裝在/usr/local/php中,用交互模式進入容器
運行命令查看依賴:
ldd /usr/local/php/sbin/php-fpm
1
1
會列出一大堆依賴庫,並且這些庫在不同的路徑。由於用到busybox,那就將這些庫復制到工作目錄的根目錄的lib即可。即/rootfs/lib/中,用這個工具找出來的是不完整的、還有c++運行庫等等。
我整理出來的完整依賴庫是:
ld-linux-x86-64.so.2
libbz2.so.1
libc.so.6
libcom_err.so.2
libcrypt.so.1
libcrypto.so.10
libcurl.so.4
libdl.so.2
libfreebl3.so
libfreetype.so.6
libgcc_s.so.1
libgssapi_krb5.so.2
libiconv.so.2
libidn.so.11
libjpeg.so.62
libk5crypto.so.3
libkeyutils.so.1
libkrb5.so.3
libkrb5support.so.0
liblber-2.4.so.2
libldap-2.4.so.2
liblzma.so.5
libm.so.6
libmcrypt.so.4
libnsl.so.1
libnspr4.so
libnss_files.so.2
libnss3.so
libnssutil3.so
libpcre.so.1
libplc4.so
libplds4.so
libpng15.so.15
libpthread.so.0
libresolv.so.2
librt.so.1
libsasl2.so.3
libselinux.so.1
libsmime3.so
libssh2.so.1
libssl.so.10
libssl3.so
libstdc++.so.6
libxml2.so.2
libz.so.1
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
當然根據你php安裝的擴展而定,但是有些決不能缺少,
復制到rootfs/lib/
3、復制php程序
#復制PHP程序
cp -R /usr/local/php /rootfs/usr/local/php
#復制啟動腳本
cp /etc/init.d/php-fpm /rootfs/php-fp
將 /usr/local/php/php-fpm.conf 改為以下配置,守護進程方式運行改為no,不然 到時候只能用交互模式 docker run -it 那種。
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
daemonize = no #這里重要
[www]
listen = 0.0.0.0:9000 #這里也重要
listen.backlog = -1
#listen.allowed_clients = any
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log
4、打包tar文件
tar cf /rootfs.tar .
5、按ctrl+p+q使php容器後台運行,找個地方創建工作目錄,並且寫DockerFile。
#將rootfs.tar 復制出來,其實這個已經是一個基於busybox+php創建的小型系統了
docker cp technofiend/php:/rootfs.tar .
寫DockerFile
FROM scratch
MAINTAINER Technofiend <[email protected]>
ADD rootfs.tar /
WORKDIR /home
EXPOSE 9000
ENTRYPOINT ["/php-fpm", "start"]
然後build系統
docker build -t technofiend/miniphp .
這里寫圖片描述
再看看體積,瘦了很多。比還沒用過的centos系統還要少。
要是導出來再壓縮的話,就只有50M左右,真是快速部署必不可少的玩意啊!
注意:體積少的鏡像雖然可以減少了網路傳輸的時間,達到快速部署的目的,但體積少的容器某些功能例如busybox提供的,可能沒有完整版的性能好。所以,還是看實際用途吧!
別忘了,要定期進行安全升級,不然很可能就會有安全隱患。
Ⅶ PHP開發指南如何實現理解依賴注入容器
。我認為有一部分原因是由於大多數介紹依賴注入的例子缺乏實際意義,讓人難理解。因為PHP主要用於Web開發,那就先來看一個簡單的web開發實例。
HTTP本身是一個無狀態的連接協議,為了支持客戶在發起WEB請求時應用程序能存儲用戶信息,我們就需要通過一種技術來實現存儲狀態交互。理所當然最簡單的是使用cookie,更好的方式是PHP內置的Session機制。
$_SESSION['language'] = 'fr';
1
上面代碼將用戶語言存儲在了名為language的Session變數中,因此在該用戶隨後的請求中,可以通過全局數組$_SESSION來獲取language:
$user_language = $_SESSION['language'];
1
依賴注入主要用於面向對像開發,現在讓我們假設我們有一個SessionStorage類,該類封裝了PHP Session機制:
class SessionStorage
{
function __construct($cookieName = 'PHP_SESS_ID')
{
session_name($cookieName);
session_start();
}
function set($key, $value)
{
$_SESSION[$key] = $value;
}
function get($key)
{
return $_SESSION[$key];
}
// ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
同時還有一個User類提供了更高級的封裝:
class User
{
protected $storage;
function __construct()
{
$this->storage = new SessionStorage();
}
function setLanguage($language)
{
$this->storage->set('language', $language);
}
function getLanguage()
{
return $this->storage->get('language');
}
// ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
代碼很簡單,同樣使用User類也很簡單:
$user = new User();
$user->setLanguage('fr');
$user_language = $user->getLanguage();
1
2
3
一切都很美好,除非你的程序需要更好的擴展性。假設現在你想要更改保存session_id的COOKIE鍵值,以下有一些可供選擇的方法:
User類中創建SessionStorage實例時,在SessionStorage構造方法中使用字元串』SESSION_ID』硬編碼:
class User
{
function __construct()
{
$this->storage = new SessionStorage('SESSION_ID');
}
// ...
}
1
2
3
4
5
6
7
8
在User類外部設置一個常量(名為STORAGE_SESSION_NAME)
class User
{
function __construct()
{
$this->storage = new SessionStorage(STORAGE_SESSION_NAME);
}
// ...
}
define('STORAGE_SESSION_NAME', 'SESSION_ID');
1
2
3
4
5
6
7
8
9
10
通過User類構造函數中的參數傳遞Session name
class User
{
function __construct($sessionName)
{
$this->storage = new SessionStorage($sessionName);
}
// ...
}
$user = new User('SESSION_ID');
1
2
3
4
5
6
7
8
9
10
11
還是通過User類構造函數中的參數傳遞Session name,不過這次參數採用數組的方式
class User
{
function __construct($storageOptions)
{
$this->storage = new SessionStorage($storageOptions['session_name']);
}
// ...
}
$user = new User(array('session_name' => 'SESSION_ID'));
1
2
3
4
5
6
7
8
9
10
上面的方式都很糟糕。
在user類中硬編碼設置session name的做法沒有真正解決問題,如果以後你還需要更改保存session_id的COOKIE鍵值,你不得不再一次修改user類(User類不應該關心COOKIE鍵值)。
使用常量的方式同樣很糟,造成User類依賴於一個常量設置。
通過User類構造函數的參數或數組來傳遞session name相對來說好一些,不過也不完美,這樣做干擾了User類構造函數的參數,因為如何存儲Session並不是User類需要關心的,User類不應該和它們扯上關聯。
另外,還有一個問題不太好解決:我們如何改變SessionStorage類。這種應用場景很多,比如你要用一個Session模擬類來做測試,或者你要將Session存儲在資料庫或者內存中。目前這種實現方式,在不改變User類的情況下,很難做到這點。
現在,讓我們來使用依賴注入。回憶一下,之前我們是在User類內部創建SessionStorage對像的,現在我們修改一下,讓SessionStorage對像通過User類的構造函數傳遞進去。
class User
{
function __construct($storage)
{
$this->storage = $storage;
}
// ...
}
1
2
3
4
5
6
7
8
9
這就是依賴注入最經典的案例,沒有之一。現在使用User類有一些小小的改變,首先你需要創建SessionStorage對像。
$storage = new SessionStorage('SESSION_ID');
$user = new User($storage);
1
2
現在,配置session存儲對像很簡單了,同樣如果改變session存儲對像也很簡單,所有這一切並不需要去更新User類,降低了業務類之間的耦合。
Pico Container 的網站上是這樣描述依賴注入:
依賴注入是通過類的構造函數、方法、或者直接寫入的方式,將所依賴的組件傳遞給類的方式。
所以依賴注入並不只限於通過構造函數注入。下面來看看幾種注入方式:
構造函數注入
class User
{
function __construct($storage)
{
$this->storage = $storage;
}
// ...
}
1
2
3
4
5
6
7
8
9
setter方法注入
class User
{
function setSessionStorage($storage)
{
$this->storage = $storage;
}
// ...
}
1
2
3
4
5
6
7
8
9
屬性直接注入
class User
{
public $sessionStorage;
}
$user->sessionStorage = $storage;
1
2
3
4
5
6
根據經驗,一般通過構造函數注入的是強依賴關系的組件,setter方式用來注入可選的依賴組件。
現在,大多數流行的PHP框架都採用了依賴注入的模式實現業務組件間的高內聚低耦合。
// symfony: 構造函數注入的例子
$dispatcher = new sfEventDispatcher();
$storage = new sfMySQLSessionStorage(array('database' => 'session', 'db_table' => 'session'));
$user = new sfUser($dispatcher, $storage, array('default_culture' => 'en'));
// Zend Framework: setter方式注入的例子
$transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', array(
'auth' => 'login',
'username' => 'foo',
'password' => 'bar',
'ssl' => 'ssl',
'port' => 465,
));
$mailer = new Zend_Mail();
$mailer->setDefaultTransport($transport);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
如果對依賴注入有興趣,強烈推薦你看《Martin Fowler introction》或者著名的《Jeff More presentation》
這就是本章的全部內容,希望對大家在理解依賴注入上有所幫助。在該系列後面的內容中,我們將討論依賴注入的容器實現。