php拓展-包管理工具详解(图)
背景
不得不说的是,昨天其实已经是基本上写完了整个工具了的(Linux上那块的shell脚本没往上添加罢了)。最后整理的时候,犯了个超级大的愚蠢的错误。
那就是忘了反选了,呵呵。一下子把源代码给删了。WTF!!!后来也使用了一些数据恢复软件,也没能成功找回。
于是今天不得不又重写了一遍,而且仅仅完成了Windows平台上的适配。Linux上的拓展管理,就先不写了,有时间再进行完善。
原理
在Windows上安装php的拓展是非常的简单,而且容易的一件事。
下载拓展对应的dll动态链接库, 然后修改php.ini文件,最后重启Apache服务器。
是的,就是这么的简单啦。
下面先说一下这个工具的作用:
爬取目标拓展的链接,做完过滤处理后罗列可以下载得到的拓展库连接。
解压下载的zip压缩包,返回动态链接库存在的位置。
查找本机php环境变量,找到拓展文件夹的位置,拷贝动态链接库并修改php.ini文件内容。
重启Apache服务器。即可生效(这个没有添加自动处理,因为我觉得手动方式会更加理智一点)。
全程我们需要做的就是指定一下要安装的拓展的名称,手动的进行选择要安装的版本,就是这么的简单啦。接下来就一步步地进行分析吧。
下载
这个工具依托的是php官网提供的拓展目录,
当然也可以使用手动下载安装的方式,这个工具就是把这个流程自动化了而已。
获取网页内容
获取网页内容的时候,为了防止网站做了防爬虫处理,我们采用模拟浏览器的方式进行。
def urlOpener(self, targeturl): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36' } return urllib2.urlopen(urllib2.Request(url=targeturl, headers=headers)).read()
正则与过滤下载链接
下载了一张网页,内容还是很多的。而我们需要的仅仅是网页中预期的下载链接罢了。所以要进行正则匹配,来过滤出我们想要的数据。
而正则有一定的灵活性,所以我们要根据具体情况进行集体的分析,于是我封装了一个函数。
# 获取指定拓展的所有能用的版本 def getLinks(self, url, regpattern): content = self.urlOpener(targeturl=url) reg = re.compile(regpattern) return re.findall(reg, content)
def getDownloadLinks(self): versionLinks = self.getLinks("http://windows.php.net/downloads/pecl/releases/{}".format(self.extensionname), '<A HREF="(/downloads/pecl/releases/{}/.*?)">'.format(self.extensionname)) for index, item in enumerate(versionLinks): print "{} : {}".format(index, item) choice = int(raw_input('Please choose the special version you want by number!\n')) return versionLinks[choice] def getTargetUrl(self): userChoice = "http://windows.php.net"+str(self.getDownloadLinks()) print userChoice regpattern = '<A HREF="(/.*?/php_.*?\.zip)">.*?<\/A>' targetUrls = self.getLinks(url=userChoice, regpattern=regpattern) # 由于正则匹配度写的不好,第一个链接不能正常匹配,因此采用折断方式,去除第一个无效链接 return targetUrls[1:]
代码中很多东西写得不是通用的,因为这个工具本身就是要依赖于这个网站而是用的。所以没有做具体的重构处理, 而这已然是足够的了。
下载预期目标
从上面即可获取到经由用户选择的下载链接,然后我们就可以据此来进行特定版本的拓展包下载了。
def folderMaker(self): if not os.path.exists(r'./packages/{}'.format(self.extensionname)): os.mkdir(r'./packages/{}'.format(self.extensionname)) def download(self): choices = self.getTargetUrl() for index, item in enumerate(choices): print "{} : {}".format(index, item) choice = int(raw_input('Please choose the special version which suitable for your operation system you want by number!\n')) userChoice = choices[choice] # 对外提供友好的用户提示信息,优化的时候可通过添加进度条形式展现 print 'Downloading, please wait...' # 开启下载模式,进行代码优化的时候可以使用多线程来进行加速 data = self.urlOpener(targeturl="http://windows.php.net"+str(userChoice)) # 将下载的资源存放到 本地资源库(先进行文件夹存在与否判断) filename = userChoice.split('/')[-1] self.folderMaker() with open(r'./packages/{}/{}'.format(self.extensionname, filename), 'wb') as file: file.write(data) print '{} downloaded!'.format(filename)
解压
第一个步骤就是下载,下载的结果就是一个zip压缩包,所以我们还需要对这个压缩包进行处理,才能为我们所用。
文件路径问题
由于是针对Windows而制作,所以文件路径分隔符就按照windows上的来吧(为了代码更加优雅,还可以使用os.sep
来兼容不同的操作系统)。
解压
def folderMaker(self, foldername): if not os.path.exists(r'./packages/{}/{}'.format(self.extensionname, foldername)): os.mkdir(r'./packages/{}/{}'.format(self.extensionname, foldername)) print 'Created folder {} succeed!'.format(foldername) def unzip(self): filelists = [item for item in os.listdir(r'./packages/{}/'.format(self.extensionname)) if item.endswith('.zip')] filezip = zipfile.ZipFile(r'./packages/{}/{}'.format(self.extensionname, filelists[0])) foldername = filelists[0].split('.')[0] self.folderMaker(foldername=foldername) print 'Uncompressing files, please wait...' for file in filezip.namelist(): filezip.extract(file, r'./packages/{}/{}/{}'.format(self.extensionname, foldername, file)) filezip.close() print 'Uncompress files succeed!'
安装与配置
安装与配置其实是两个话题了。
安装
首先是要将下载好的拓展的dll
文件放置到php安装目录下的拓展文件夹,这个过程就涉及到了寻找php拓展目录的问题。然后是文件拷贝的问题。
def getPhpExtPath(self): # 默认系统中仅有一个php版本 rawpath = [item for item in os.getenv('path').split(';') if item.__contains__('php')][0] self.phppath = rawpath return rawpath+str('ext\\') def getExtensionDllPath(self): for root, dirs, files in os.walk(r'./packages/{}/'.format(self.extensionname)): extensionfolder = root.split('\\')[-1] if extensionfolder.__contains__('dll'): return root.split('\\')[0] + '/' + extensionfolder+'/'+extensionfolder
代码未完,下面会把拷贝的那段放上去的。
配置
配置就是需要在php.ini文件中进行声明,也就是添加下面的这样一条语句。(在Dynamic Extension块下面即可)
extension=XX.dll
# 针对php.ini文件中的相关的拓展选项进行针对性的添加.采用的具体方式是使用临时文件替换的方法 def iniAppend(self): inipath = self.phppath+str('php.ini') tmpinipath = self.phppath+str('php-tmp.ini') # 要进行替换的新的文件内容 newcontent = '; Windows Extensions\nextension={}.dll'.format(self.extensionname) open(tmpinipath, 'w').write( re.sub(r'; Windows Extensions', newcontent, open(inipath).read())) # 进行更名操作 os.rename(inipath, self.phppath+str('php.bak.ini')) os.rename(tmpinipath, self.phppath+str('php.ini')) print 'Rename Succeed!' def configure(self): # 打印php拓展目录路径 extpath = self.getPhpExtPath()+str('php_{}.dll'.format(self.extensionname)) print extpath # 获取到拓展动态链接库及其路径 extensiondllpath = self.getExtensionDllPath() # 将拓展文件添加到php拓展目录中 shutil.copyfile(extensiondllpath, extpath) # 在php.ini文件中添加对应的拓展选项 self.iniAppend() print '{} 拓展已添加,拓展服务将在重启Apache服务器后生效!'.format(self.extensionname)
最后让Apache重启就可以生效啦。
演示
初始状态
安装与配置完毕状态
激活状态
总结
最后来总结一下,这个工具主要使用到了Python语言,方便,优雅,快捷。
完成了对PHP拓展的安装与配置,大大简化了操作量。
其实,我觉得使用代码来完成安装与配置工作不是很恰当。然而在Windows上也就罢了,毕竟批命令处理起来也不是很好用(PowerShell我没怎么用过,所以我没有发言权。),而要是在Linux上就不一样了,做一些这样的任务,使用Shell来写是最合适不过的了, 而且还可以写的很灵活。
Atas ialah kandungan terperinci php拓展-包管理工具详解(图). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.
