<?<span php </span><span /*</span><span * * SVN 外部命令 类 * * @author rubekid * * @todo comment need addslashes for svn commit * </span><span */</span> <span class</span><span SvnUtils { </span><span /*</span><span * * * svn 账号 </span><span */</span> <span const</span> SVN_USERNAME = "robot"<span ; </span><span /*</span><span * * svn 密码 </span><span */</span> <span const</span> SVN_PASSWORD = "robot2013"<span ; </span><span /*</span><span * * 配置文件目录 (任意指定一个临时目录,解决svn: warning: Can't open file '/root/.subversion/servers': Permission denied) </span><span */</span> <span const</span> SVN_CONFIG_DIR = "/var/tmp/"<span ; </span><span /*</span><span * * svn list * * @param $repository string * @return boolean * </span><span */</span> <span public</span> <span static</span> <span function</span> ls(<span $repository</span><span ) { </span><span $command</span> = "sudo svn ls " . <span $repository</span><span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $output</span> = <span implode</span> ( "<br />", <span $output</span><span ); </span><span if</span> (<span strpos</span> ( <span $output</span>, 'non-existent in that revision'<span )) { </span><span return</span> <span false</span><span ; } </span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ; } </span><span /*</span><span * * svn copy * * @param $src string * @param $dst string * @param $comment string * @return boolean * </span><span */</span> <span public</span> <span static</span> <span function</span> <span copy</span>(<span $src</span>, <span $dst</span>, <span $comment</span><span ) { </span><span $command</span> = "sudo svn cp <span $src</span> <span $dst</span> -m '<span $comment</span>'"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $output</span> = <span implode</span> ( "<br />", <span $output</span><span ); </span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision'<span )) { </span><span return</span> <span true</span><span ; } </span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ; } </span><span /*</span><span * * svn delete * * @param $url string * @param $comment string * @return boolean * </span><span */</span> <span public</span> <span static</span> <span function</span> delete(<span $url</span>, <span $comment</span><span ) { </span><span $command</span> = "sudo svn del <span $url</span> -m '<span $comment</span>'"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span ); </span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision'<span )) { </span><span return</span> <span true</span><span ; } </span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ; } </span><span /*</span><span * * svn move * * @param $src string * @param $dst string * @param $comment string * @return boolean </span><span */</span> <span public</span> <span static</span> <span function</span> move(<span $src</span>, <span $dst</span>, <span $comment</span><span ) { </span><span $command</span> = "sudo svn mv <span $src</span> <span $dst</span> -m '<span $comment</span>'"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span ); </span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision'<span )) { </span><span return</span> <span true</span><span ; } </span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ; } </span><span /*</span><span * * svn mkdir * * @param $url string * @param $comment string * @return boolean </span><span */</span> <span public</span> <span static</span> <span function</span> <span mkdir</span>(<span $url</span>, <span $comment</span><span ) { </span><span $command</span> = "sudo svn mkdir <span $url</span> -m '<span $comment</span>'"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span ); </span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision'<span )) { </span><span return</span> <span true</span><span ; } </span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ; } </span><span /*</span><span * * svn diff * @param $pathA string * @param $pathB string * @return string </span><span */</span> <span public</span> <span static</span> <span function</span> diff(<span $pathA</span>, <span $pathB</span><span ) { </span><span $output</span> = self::runCmd ( "sudo svn diff <span $pathA</span> <span $pathB</span>"<span ); </span><span return</span> <span implode</span> ( '<br />', <span $output</span><span ); } </span><span /*</span><span * * svn checkout * @param $url string * @param $dir string * @return boolean </span><span */</span> <span public</span> <span static</span> <span function</span> checkout(<span $url</span>, <span $dir</span><span ) { </span><span $command</span> = "cd <span $dir</span> && sudo svn co <span $url</span>"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span ); </span><span if</span> (<span strstr</span> ( <span $output</span>, 'Checked out revision'<span )) { </span><span return</span> <span true</span><span ; } </span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ; } </span><span /*</span><span * * svn update * @param $path string </span><span */</span> <span public</span> <span static</span> <span function</span> update(<span $path</span><span ) { </span><span $command</span> = "cd <span $path</span> && sudo svn up"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span ); </span><span preg_match_all</span> ( "/[0-9]+/", <span $output</span>, <span $ret</span><span ); </span><span if</span> (! <span $ret</span> [0] [0<span ]) { </span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ; } </span><span return</span> <span $ret</span> [0] [0<span ]; } </span><span /*</span><span * * svn merge * * @param $revision string * @param $url string * @param $dir string * * @return boolean </span><span */</span> <span public</span> <span static</span> <span function</span> merge(<span $revision</span>, <span $url</span>, <span $dir</span><span ) { </span><span $command</span> = "cd <span $dir</span> && sudo svn merge -r1:<span $revision</span> <span $url</span>"<span ; </span><span $output</span> = <span implode</span> ( '<br />', self::runCmd ( <span $command</span><span ) ); </span><span if</span> (<span strstr</span> ( <span $output</span>, 'Text conflicts'<span )) { </span><span return</span> 'Command: ' . <span $command</span> . '<br />' . <span $output</span><span ; } </span><span return</span> <span true</span><span ; } </span><span /*</span><span * * svn commit * * @param $dir string * @param $comment string * * @return boolean </span><span */</span> <span public</span> <span static</span> <span function</span> commit(<span $dir</span>, <span $comment</span><span ) { </span><span $command</span> = "cd <span $dir</span> && sudo svn commit -m'<span $comment</span>'"<span ; </span><span $output</span> = <span implode</span> ( '<br />', self::runCmd ( <span $command</span><span ) ); </span><span if</span> (<span strpos</span> ( <span $output</span>, 'Committed revision' ) || <span empty</span> ( <span $output</span><span )) { </span><span return</span> <span true</span><span ; } </span><span return</span> <span $output</span><span ; } </span><span /*</span><span * * svn status (输出WC中文件和目录的状态) * * @param $dir string </span><span */</span> <span public</span> <span static</span> <span function</span> getStatus(<span $dir</span><span ) { </span><span $command</span> = "cd <span $dir</span> && sudo svn st"<span ; </span><span return</span> self::runCmd ( <span $command</span><span ); } </span><span /*</span><span * * svn 冲突 * * @param $dir string * @return boolean </span><span */</span> <span public</span> <span static</span> <span function</span> hasConflict(<span $dir</span><span ) { </span><span $output</span> = self::getStatus ( <span $dir</span><span ); </span><span foreach</span> ( <span $output</span> <span as</span> <span $line</span><span ) { </span><span if</span> ( <span substr</span> ( <span trim</span> ( <span $line</span> ), 0, 1 ) == 'C' || (<span substr</span> ( <span trim</span> ( <span $line</span> ), 0, 1 ) == '!'<span )) { </span><span return</span> <span true</span><span ; } } </span><span return</span> <span false</span><span ; } </span><span /*</span><span * * svn log * * @param $path string * @return string * </span><span */</span> <span public</span> <span static</span> <span function</span> getLog(<span $path</span><span ) { </span><span $command</span> = "sudo svn log <span $path</span> --xml"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span return</span> <span implode</span> ( '', <span $output</span><span ); } </span><span /*</span><span * * svn info * @param $path string </span><span */</span> <span public</span> <span static</span> <span function</span> getPathRevision(<span $path</span><span ) { </span><span $command</span> = "sudo svn info <span $path</span> --xml"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $string</span> = <span implode</span> ( '', <span $output</span><span ); </span><span $xml</span> = <span new</span> SimpleXMLElement ( <span $string</span><span ); </span><span foreach</span> ( <span $xml</span>->entry [0]->attributes () <span as</span> <span $key</span> => <span $value</span><span ) { </span><span if</span> ( <span $key</span> == 'revision'<span ) { </span><span return</span> <span $value</span><span ; } } } </span><span /*</span><span * * 获取最新版本号 * @param $path string </span><span */</span> <span public</span> <span static</span> <span function</span> getHeadRevision(<span $path</span><span ) { </span><span $command</span> = "cd <span $path</span> && sudo svn up"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span $output</span> = <span implode</span> ( '<br />', <span $output</span><span ); </span><span preg_match_all</span> ( "/[0-9]+/", <span $output</span>, <span $ret</span><span ); </span><span if</span> (! <span $ret</span> [0] [0<span ]) { </span><span return</span> "<br />" . <span $command</span> . "<br />" . <span $output</span><span ; } </span><span return</span> <span $ret</span> [0] [0<span ]; } </span><span /*</span><span * * 获取某文件最早版本号 * * @param $filePath string * </span><span */</span> <span public</span> <span static</span> <span function</span> getFileFirstVersion(<span $filePath</span><span ){ </span><span $command</span> = "sudo svn log {<span $filePath</span>}"<span ; </span><span $output</span> = self::runCmd ( <span $command</span> , "|grep -i ^r[0-9]* |awk '{print $1}'"<span ); </span><span if</span>(<span empty</span>(<span $output</span><span )){ </span><span return</span> <span false</span><span ; } </span><span return</span> <span str_replace</span>("r", '', <span $output</span>[<span count</span>(<span $output</span>)-1<span ]); } </span><span /*</span><span * * 获取两个版本间修改的文件信息列表 * * @param $fromVersion int * @param $headRevision int * @param $$path string * * @return array </span><span */</span> <span public</span> <span static</span> <span function</span> getChangedFiles(<span $path</span>, <span $fromVersion</span>, <span $headRevision</span><span ){ </span><span $files</span> = <span array</span><span (); </span><span $pipe</span> = "|grep -i ^Index:|awk -F : '{print $2}'"<span ; </span><span $command</span> = "svn diff -r {<span $fromVersion</span>}:{<span $headRevision</span>} <span $path</span>"<span ; </span><span $output</span> = self::runCmd ( <span $command</span> ,<span $pipe</span><span ); </span><span $files</span> = <span array_merge</span>(<span $files</span>, <span $output</span><span ); </span><span $command</span> = "svn diff -r {<span $headRevision</span>}:{<span $fromVersion</span>} <span $path</span>"; <span //</span><span 文件删除可用逆向对比</span> <span $output</span> = self::runCmd ( <span $command</span> ,<span $pipe</span><span ); </span><span $files</span> = <span array_merge</span>(<span $files</span>, <span $output</span><span ); </span><span return</span> <span array_unique</span>(<span $files</span><span ); } </span><span /*</span><span * * 获取两个版本间某文件修改 的内容 * * @param $filePath string * @param $fromVersion int * @param $headRevision int * * @return array </span><span */</span> <span public</span> <span static</span> <span function</span> getChangedInfo( <span $filePath</span>, <span $fromVersion</span>, <span $headRevision</span><span ){ </span><span $command</span> = "sudo svn diff -r {<span $fromVersion</span>}:{<span $headRevision</span>} <span $filePath</span>"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span return</span> <span $output</span><span ; } </span><span /*</span><span * * 查看文件内容 * * @param $filePath string * @param $version int * * @return array </span><span */</span> <span public</span> <span static</span> <span function</span> getFileContent(<span $filePath</span>, <span $version</span><span ){ </span><span $command</span> = "sudo svn cat -r {<span $version</span>} <span $filePath</span>"<span ; </span><span $output</span> = self::runCmd ( <span $command</span><span ); </span><span return</span> <span $output</span><span ; } </span><span /*</span><span * * Run a cmd and return result * @param $command string * @param $pipe string (可以增加管道对返回数据进行预筛选) * @return array </span><span */</span> <span protected</span> <span static</span> <span function</span> runCmd(<span $command</span> , <span $pipe</span> =""<span ) { </span><span $authCommand</span> = ' --username ' . self::SVN_USERNAME . ' --password ' . self::SVN_PASSWORD . ' --no-auth-cache --non-interactive --config-dir ' . self::SVN_CONFIG_DIR . '.subversion'<span ; </span><span exec</span> ( <span $command</span> . <span $authCommand</span> . " 2>&1" . <span $pipe</span>, <span $output</span><span ); </span><span return</span> <span $output</span><span ; } }</span>

PHP在現代Web開發中仍然重要,尤其在內容管理和電子商務平台。 1)PHP擁有豐富的生態系統和強大框架支持,如Laravel和Symfony。 2)性能優化可通過OPcache和Nginx實現。 3)PHP8.0引入JIT編譯器,提升性能。 4)雲原生應用通過Docker和Kubernetes部署,提高靈活性和可擴展性。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP在現代編程中仍然是一個強大且廣泛使用的工具,尤其在web開發領域。 1)PHP易用且與數據庫集成無縫,是許多開發者的首選。 2)它支持動態內容生成和麵向對象編程,適合快速創建和維護網站。 3)PHP的性能可以通過緩存和優化數據庫查詢來提升,其廣泛的社區和豐富生態系統使其在當今技術棧中仍具重要地位。

在PHP中,弱引用是通過WeakReference類實現的,不會阻止垃圾回收器回收對象。弱引用適用於緩存系統和事件監聽器等場景,需注意其不能保證對象存活,且垃圾回收可能延遲。

\_\_invoke方法允許對象像函數一樣被調用。 1.定義\_\_invoke方法使對象可被調用。 2.使用$obj(...)語法時,PHP會執行\_\_invoke方法。 3.適用於日誌記錄和計算器等場景,提高代碼靈活性和可讀性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用