search
HomeBackend DevelopmentPHP Tutorialliving comfortably without anybody's help.

Grunt is very popular nowadays. Although it is fun to use, its configuration is really annoying. If you haven't used it before and want to be proficient in it all at once, there is a certain learning cost, and you also have to install the big guy node. At the beginning of the project, we chose the lightweight tool compiler.jar for packaging. I have been thinking about how to write a one-click packaging tool. Previously, we manually spliced ​​some js files into a batch file that met the requirements of the compiler.jar packaging file, and then ran this batch to generate the js and css files we needed. As the number of js files increases, manually splicing the addresses of these files becomes very difficult, and it is easy to miss or duplicate certain files, so the writing of the "one-click packaging tool" becomes urgent. . Below is part of a real index.html file:

<spanmicrosoft yahei><span><span>DOCTYPE html</span><span>></span>
<span><span>html</span><span>></span>
<span><span>head</span><span>></span>
    <span><span>meta </span><span>charset</span><span>="utf-8"</span><span>></span>
    <span><span>meta </span><span>http-equiv</span><span>="X-UA-Compatible"</span><span> content</span><span>="IE=edge,chrome=1"</span><span>></span>
    <span><span>meta </span><span>name</span><span>="viewport"</span><span> content</span><span>="target-densitydpi=device-dpi, initial-scale=1, user-scalable=0, maximum-scale=1"</span><span>></span>
     <span><!--</span><span>隐藏浏览器的工具栏和菜单栏,对iso系统起用</span><span>--></span>
    <span><!--用于PC上调式,不参与合并压缩</span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/data/database.js"</span><span> name</span><span>="noBuild"</span><span>></span><span>script</span><span>></span>
    <span><!--</span><span>Iframe加载处理</span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/LoadMode.js"</span><span>></span><span>script</span><span>></span>

    <span><span>script </span><span>src</span><span>="lib/core/jQuery.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/core/underscore.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/SVGIcons/snap.min.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/pixi.js"</span><span>></span><span>script</span><span>></span>

    <span><span>script </span><span>src</span><span>="lib/core/Xut.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/core/isMobile.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/core/aaronRequire.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/core/nextTick.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/Config.js"</span><span>></span><span>script</span><span>></span>

    <span><span>script </span><span>src</span><span>="lib/core/lang/Object.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/core/lang/Function.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/core/lang/Array.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/core/video.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span> 自定义事件,合集处理,iframe通讯 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/core/event/asEvented.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/core/message/pms.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span>插件</span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/cordova.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/readAssetsFilePlugin.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/initDatabase.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/web.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/video.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/openAppPlugin.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/tabletPlugin.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/statusbar.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/iap.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/AppStoreLink.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/downloadPlugin.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/xxteManager.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/unzipPlugin.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/readPlugin.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/plugin/deletePlugin.js"</span><span>></span><span>script</span><span>></span>
    <span><!--</span><span> 动画库 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/animate/TweenMax.min.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/plugins/ThrowPropsPlugin.min.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/PptAnimation.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/CanvasAnimation.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/dragdrop/Draggable.min.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/dragdrop/dragdrop.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/iscroll.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/hammer.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/SVGIcons/svgicons-config.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/SVGIcons/svgicons.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/animate/SpriteA.js"</span><span>></span><span>script</span><span>></span>

    <span><span>script </span><span>src</span><span>="lib/util/Utils.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/util/LocalStorage.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/util/ScriptLoad.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/util/ExecuteSql.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/util/PromptNotice.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/util/edge.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span> 配置文件,数据文件,结构文件 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/data/Store.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/data/StoreManager.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span> 数据初始化 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/Main.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/Initialize.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scenario/SceneLayout.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scenario/SceneFactory.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scenario/SceneController.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/LoadScene.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/Dispatcher.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span> 工具栏 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/toolbar/Navbar.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/toolbar/sToolbar.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/toolbar/fToolbar.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/toolbar/searchBar.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/toolbar/bookMark.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span> 多线程任务片 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/threadTask/Buffer.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/threadTask/TaskContents.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/threadTask/TaskComponents.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/threadTask/TaskBackground.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/threadTask/TaskContainer.js"</span><span>></span><span>script</span><span>></span>

    <span><span>script </span><span>src</span><span>="lib/pageBase/Parser.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/pageBase/Collection.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/pageBase/MultiEvent.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/pageBase/PageBase.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/pageBase/Page.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/pageBase/Master.js"</span><span>></span><span>script</span><span>></span>


    <span><!--</span><span> 页面管理模块 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/controller/transform/Translation.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/OverrideApi.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/Abstract.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/Emitter.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/PageMgr.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/MasterMgr.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/Compiler.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/ViewModel.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/SwitchPage.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/controller/EventDrive.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span>热点管理</span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/scheduler/AssignAutoRun.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scheduler/AssignTrigger.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scheduler/AssignSuspend.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scheduler/AssignOriginal.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scheduler/AssignRecovery.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scheduler/ProcessControl.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/scheduler/Binding.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span> 适配器,用于处理热点 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/directives/dir-Content.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/directives/dir-Widget.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/directives/dir-Media.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/directives/dir-Action.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/directives/dir-ShowNote.js"</span><span>></span><span>script</span><span>></span>

     <span><!--</span><span>多媒体对象 </span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/component/media/Audio.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/component/media/Video.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/component/media/AudioManager.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/component/media/VideoManager.js"</span><span>></span><span>script</span><span>></span>

    <span><!--</span><span>文本热点</span><span>--></span>
    <span><span>script </span><span>src</span><span>="lib/component/content/conFilter.js"</span><span>></span><span>script</span><span>></span>
    <span><span>script </span><span>src</span><span>="lib/component/content/conAlgorithm.js"</span><span>></span><span>script</span><span>></span>
<br></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></spanmicrosoft>

There are still a lot of bugs to come. A living person cannot be choked to death by urinating. There are always more solutions than problems. I know a little bit of PHP. PHP is very good at processing files. It's time to let it play a role. So I thought of using PHP to automatically extract the js and css in the index, then generate a batch file in the specified format, run the batch silently in the background, and finally return the results to the monitor. This way I can sit back and enjoy the results. Thinking about it makes me a little excited, so I simply wrote an interface.

The next step is to implement the function. Don’t rush to write the code first, analyze the requirements:

1. Traverse the index.html file and extract js files or css files.

2. Filter this file, because some are commented out and some are used for debugging.

3. Generate the corresponding batch file

4. Execute batch file

5. Display processing results

Since there are two situations, I will use a factory mode to adapt it to facilitate the expansion of other types in the future. I need to take a longer-term view. Now that we have the factory, we simply add another interface. It is agreed that the two interfaces of "receiving requests" and "output results" must be implemented. Think about it again, both js and css may have the same functions. Let them inherit a parent class to reuse code, so inheritance is also used first. The current design should meet my requirements, so I started writing php code.

<span>php
</span><span>header</span>("Content-type: text/html; charset=utf-8"<span>);

</span><span>/*</span><span>*
 * 根据index.html文件中引用的js,生成compressJs.bat
 * @author frog 
 * @date 2014-11-17
 </span><span>*/</span>

<span>interface</span><span> ICompress {
    </span><span>/*</span><span>*
     * 处理用户请求
     * @return [type] [description]
     </span><span>*/</span>
    <span>public</span> <span>function</span><span> request();

    </span><span>/*</span><span>*
     * 处理输出结果
     * @return [type] [description]
     </span><span>*/</span>
    <span>public</span> <span>function</span><span> render();
}

</span><span>class</span><span> BaseCompress {
    </span><span>public</span> <span>$content</span><span>;
    </span><span>public</span> <span>$outPath</span><span>;
    </span><span>public</span> <span>$isAuto</span><span>;

    </span><span>public</span> <span>function</span> __construct(<span>$isAuto</span>=<span>false</span><span>){
        </span><span>$outPath</span> = '_file'<span>;
        </span><span>if</span>(!<span>is_dir</span>(<span>$outPath</span><span>)){
            </span><span>mkdir</span>(<span>$outPath</span><span>);
        }
        </span><span>$this</span>->outPath = <span>$outPath</span><span>;
        </span><span>$this</span>->isAuto = <span>$isAuto</span><span>;
    }


    </span><span>/*</span><span>*
     * 运行批处理
     * @return [type] [description]
     </span><span>*/</span>
    <span>public</span> <span>function</span> runBat(<span>$name</span><span>){

    }
}

</span><span>/*</span><span>*
 * 压缩javascript文件
 * 合并javascript文件
 </span><span>*/</span>
<span>class</span> CompressJS <span>extends</span> BaseCompress <span>implements</span><span> ICompress {

    </span><span>/*</span><span>*
     * 处理用户请求
     * @return [type] [description]
     </span><span>*/</span>
    <span>public</span> <span>function</span><span> request(){

    }

    </span><span>/*</span><span>*
     * 处理输出结果
     * @return [type] [description]
     </span><span>*/</span>
        <span>public</span> <span>function</span><span> render(){}

}

</span><span>/*</span><span>*
 * 压缩样式文件
 </span><span>*/</span>
<span>class</span> CompressCSS <span>extends</span> BaseCompress <span>implements</span><span> ICompress {

    </span><span>public</span> <span>function</span><span> request(){
 
    }

    </span><span>/*</span><span>*
     * 处理输出结果
     * @return [type] [description]
     </span><span>*/</span>
         <span>public</span> <span>function</span><span> render(){}
     
}

</span><span>/*</span><span>*
 * 工厂类
 </span><span>*/</span>
<span>class</span><span> Factory {

    </span><span>public</span> <span>static</span> <span>function</span> create(<span>$type</span>,<span>$isAuto</span><span>){
        </span><span>$ob</span> = <span>null</span><span>;
        </span><span>switch</span> (<span>$type</span><span>) {
            </span><span>case</span> 'js':
                <span>$ob</span> = <span>new</span> CompressJS(<span>$isAuto</span><span>);
                </span><span>break</span><span>;
            </span><span>case</span> 'css':
                <span>$ob</span> = <span>new</span> CompressCSS(<span>$isAuto</span><span>);
                </span><span>break</span><span>;
            </span><span>default</span>:
                <span>#</span><span> code...</span>
                <span>break</span><span>;
        }
        </span><span>return</span> <span>$ob</span><span>;
    }
}</span>

Then the call processing:

<span>//</span><span>处理ajax请求</span>
<span>if</span>(<span>isset</span>(<span>$_POST</span>['submit'<span>])){
    </span><span>//</span><span>是否自动执行批处理</span>
    <span>$isAuto</span> = <span>$_POST</span>['zip'] === 'true' ? <span>true</span> : <span>false</span><span>;
    </span><span>//</span><span>处理类型</span>
    <span>$type</span> = <span>$_POST</span>['type'<span>];

    </span><span>$c</span> = Factory::create(<span>$type</span>,<span>$isAuto</span><span>);<br>
    //接口方法
    </span><span>$c</span>-><span>request();
    </span><span>$c</span>-><span>render();

}</span><span>else</span><span>{
    </span><span>echo</span> '请使用静态页访问本程序:<a href="index.html">点此进入</a>'<span>;
}</span>

The rough skeleton comes out. The specific coding process is relatively simple. The slightly more difficult method is to perform batch processing.

This is a method provided online, you may need it in the future, so I post it here:

<span>public</span> <span>function</span> runBat(<span>$name</span><span>){
        </span><span>if</span>(!<span>file_exists</span>(<span>$name</span>) || !<span>$this</span>-><span>isAuto){
            </span><span>return</span><span>;
        }
        </span><span>//</span><span>转入后台处理</span>
        @<span>exec</span>(<span>pclose</span>(<span>popen</span>("start /B ". <span>escapeshellcmd</span>(<span>$name</span>), "r"<span>)));
    }</span>

In the previous index.html, there is a name="noBuild" that I added artificially. This is because I want to filter js files with this logo. In this way, if I want to filter other files in the future, I only need to add this logo. That’s it, no need to change the php code. Since it is for internal use, there is no form item to specify the path of the project. By default, the upper-level directory where index.html is located is the project directory. This design simplifies operation and improves efficiency.

Regarding traversing specific files, I recommend the glob function, a very simple solution:

<span>$files</span> = <span>glob</span>(<span>$path</span>.'/*.css',GLOB_NOSORT);

The following is the project directory structure diagram:

Another operation rendering:

The last is the processing result picture:

Finally, I no longer have to write grunt configuration and install node. I no longer have to worry about pulling down a bunch of node stuff from svn when updating. It’s time to say goodbye to them:

It seems I forgot to show the front-end code:

<span>/*</span><span>*
 * 选项卡类
 * @param {string} id 选项卡的ID
 </span><span>*/</span>
<span>function</span><span> Tabs(id){
    </span><span>var</span> node = document.querySelector('#'+<span>id);
    </span><span>var</span> selected = node.querySelector('.selected'<span>);
    </span><span>this</span>.selected =<span> selected;
    </span><span>this</span>.node =<span> node;
    </span><span>this</span><span>.bindEvent();
}

</span><span>/*</span><span>*
 * 切换选项卡
 * @param  {object} event 事件
 * @return {[type]}   [description]
 </span><span>*/</span><span>
Tabs.prototype.change </span>= <span>function</span><span>(event){
    </span><span>var</span> element =<span> event.target;
    </span><span>if</span>(element.tagName.toLowerCase()=='li'<span>){
        </span><span>if</span>(element.className=='selected'<span>){
            </span><span>return</span><span>;
        }
    }</span><span>else</span><span>{
        </span><span>while</span>(element != <span>this</span><span>.node){
            element </span>=<span> element.parentNode;
            </span><span>if</span>(element.tagName.toLowerCase()=='li'<span>){
                </span><span>break</span><span>;
            }
        }
        </span><span>if</span>(element == <span>this</span>.node) <span>return</span><span>;
    }
    </span><span>this</span>.selected.removeAttribute('class'<span>);
    element.className </span>= 'selected'<span>;
    </span><span>this</span>.selected =<span> element;
    </span><span>this</span><span>.content();
}

Tabs.prototype.content </span>= <span>function</span><span>(){
  </span><span>var</span> form =<span> document.form1;

    </span><span>switch</span>(<span>this</span><span>.getTabType()){
      </span><span>case</span> 'js'<span>:
        form.style.display </span>= 'block'<span>;
        form.children[</span>0].innerHTML = '自动压缩JS'<span>;
        </span><span>break</span><span>;
      </span><span>case</span> 'css'<span>:
        form.style.display </span>= 'block'<span>;
        form.children[</span>0].innerHTML = '自动压缩CSS'<span>;
        </span><span>break</span><span>;
      </span><span>default</span><span>:
    }
}</span>

I know both front-end and back-end, so I am so willful. Just one click and say goodbye to worries! Make your own tools and let others do the hard work, so easy!

The above is an introduction to how to do it yourself and have enough food and clothing. It includes all aspects of the content. I hope it will be helpful to friends who are interested in PHP tutorials.

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
What data can be stored in a PHP session?What data can be stored in a PHP session?May 02, 2025 am 12:17 AM

PHPsessionscanstorestrings,numbers,arrays,andobjects.1.Strings:textdatalikeusernames.2.Numbers:integersorfloatsforcounters.3.Arrays:listslikeshoppingcarts.4.Objects:complexstructuresthatareserialized.

How do you start a PHP session?How do you start a PHP session?May 02, 2025 am 12:16 AM

TostartaPHPsession,usesession_start()atthescript'sbeginning.1)Placeitbeforeanyoutputtosetthesessioncookie.2)Usesessionsforuserdatalikeloginstatusorshoppingcarts.3)RegeneratesessionIDstopreventfixationattacks.4)Considerusingadatabaseforsessionstoragei

What is session regeneration, and how does it improve security?What is session regeneration, and how does it improve security?May 02, 2025 am 12:15 AM

Session regeneration refers to generating a new session ID and invalidating the old ID when the user performs sensitive operations in case of session fixed attacks. The implementation steps include: 1. Detect sensitive operations, 2. Generate new session ID, 3. Destroy old session ID, 4. Update user-side session information.

What are some performance considerations when using PHP sessions?What are some performance considerations when using PHP sessions?May 02, 2025 am 12:11 AM

PHP sessions have a significant impact on application performance. Optimization methods include: 1. Use a database to store session data to improve response speed; 2. Reduce the use of session data and only store necessary information; 3. Use a non-blocking session processor to improve concurrency capabilities; 4. Adjust the session expiration time to balance user experience and server burden; 5. Use persistent sessions to reduce the number of data read and write times.

How do PHP sessions differ from cookies?How do PHP sessions differ from cookies?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

How does PHP identify a user's session?How does PHP identify a user's session?May 01, 2025 am 12:23 AM

PHPidentifiesauser'ssessionusingsessioncookiesandsessionIDs.1)Whensession_start()iscalled,PHPgeneratesauniquesessionIDstoredinacookienamedPHPSESSIDontheuser'sbrowser.2)ThisIDallowsPHPtoretrievesessiondatafromtheserver.

What are some best practices for securing PHP sessions?What are some best practices for securing PHP sessions?May 01, 2025 am 12:22 AM

The security of PHP sessions can be achieved through the following measures: 1. Use session_regenerate_id() to regenerate the session ID when the user logs in or is an important operation. 2. Encrypt the transmission session ID through the HTTPS protocol. 3. Use session_save_path() to specify the secure directory to store session data and set permissions correctly.

Where are PHP session files stored by default?Where are PHP session files stored by default?May 01, 2025 am 12:15 AM

PHPsessionfilesarestoredinthedirectoryspecifiedbysession.save_path,typically/tmponUnix-likesystemsorC:\Windows\TemponWindows.Tocustomizethis:1)Usesession_save_path()tosetacustomdirectory,ensuringit'swritable;2)Verifythecustomdirectoryexistsandiswrita

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment