828华为云征文|华为云Flexus云服务器X实例——部署EduSoho网校系统、二次开发对接华为云视频点播实现CDN加速播放

news2024/10/1 16:58:07

EduSoho 是一款功能强大的网校系统,能够帮助教育机构快速搭建在线学习平台。本文将详细介绍如何在华为云服务器上安装和部署 EduSoho 网校系统,以及二次开发对接华为云视频点播VOD来实现CDN加速播放。

edusoho本地存储的视频播放存在诸多弊端。一方面,本地存储受限于服务器的性能和带宽,当大量用户同时访问时,很容易出现加载慢的情况。尤其是在高峰时段,视频的加载可能会变得极为缓慢,甚至出现卡顿、无法播放的现象,极大地影响了用户的观看体验。另一方面,本地存储需要视频网站投入大量的资金和精力进行服务器的维护和升级,成本较高。而且,一旦服务器出现故障,可能会导致视频数据的丢失,给视频网站带来不可挽回的损失。

相比之下,edusoho二次开发对接华为云视频点播 VOD 则具有明显的优势。

  • 其一,华为云视频点播 VOD
    拥有强大的云计算能力和高速的网络带宽,可以实现视频的快速加载和流畅播放。无论何时何地,用户都能享受到高质量的视频观看体验,无需担心加载慢的问题。

  • 其二,华为云视频点播 VOD
    提供了丰富的视频处理功能,如转码、加密、截图等,可以满足视频网站的各种需求。同时,它还支持多种视频格式和分辨率,适应不同设备和网络环境的播放要求。

  • 其三,华为云视频点播 VOD
    具有高可靠性和安全性。它采用了先进的分布式存储技术和数据备份机制,确保视频数据的安全可靠。即使出现硬件故障或自然灾害等情况,也能保证视频的正常播放。

    在这里插入图片描述

一、开始环境准备

  1. 选择并购买华为云服务器Flexus X
    在这里插入图片描述在这里插入图片描述

1.2 进入华为云官网(https://www.huaweicloud.com/product/flexus-x.html),登录或注册账号并完成实名认证。在产品页面选择“华为云Flexus云服务器X”,根据需求选择合适的服务器配置(如CPU、内存、存储等),并选择合适的操作系统,推荐选择Ubuntu,因为 EduSoho 在该操作系统上兼容性较好。完成选择和配置后,点击“立即购买”并完成支付。

在这里插入图片描述
在这里插入图片描述

1.3 重置密码并配置安全组

购买完成后,在华为云控制台中找到你的服务器实例,点击“重置密码”并记住新密码。然后,进入“安全组”配置,在入方向规则中添加必要的端口,如 HTTP(80)和 HTTPS(443)端口,以及 SSH(22)端口用于远程管理。

二、ssh远程连接服务器

下载并安装 putty.exe 客户端,用于远程连接你的华为云服务器。在 putty.exe 中新建会话,输入服务器的 IP 地址、用户名(默认为 root)和密码,点击连接。

在这里插入图片描述

三、安装必要的软件

3.1 初始化环境

在服务器上执行以下命令来安装 wget 并关闭防火墙及 SELinux:

bash
yum install -y wget  
systemctl stop firewalld.service  
systemctl disable firewalld.service  
setenforce 0  

3.2 或者永久关闭 SELinux

sudo vi /etc/selinux/config  
SELINUX=enforcing 改为 SELINUX=disabled

3.3 安装 Nginx PHP7.3 MySQL5.7 phpMyAdmin5.1等一些列服务器必备的环境组件在这里插入图片描述
3.4 在 http{} 配置中加入:

client_max_body_size 2048M;  

3.5 启动 Nginx

systemctl start nginx.service  

3.6 设置 Nginx 为开机启动

systemctl enable nginx.service

3.7 修改以下配置的值:

post_max_size = 1024M  
memory_limit = 1024M  
upload_max_filesize = 1024M  
启动 PHP-FPM  
systemctl start php-fpm.service  

3.8 重启 Nginx

systemctl restart nginx.service

四、把edusoho程序压缩包上传到你建立的网站更目录下

在这里插入图片描述
4.1 把 .ZIP 压缩包进行解压
在这里插入图片描述

五、 配置网站的伪静态

location / {
    index app.php;
    try_files $uri @rewriteapp;
}

location @rewriteapp {
    rewrite ^(.*)$ /app.php/$1 last;
}

六、 在浏览器中输入 http://您的域名/ 就可以进入安装界面了,按照安装向导完成剩余的安装步骤

在这里插入图片描述

七、检测网站目录是否开启对应的写入权限

在这里插入图片描述

八、填写数据库账号密码、端口号等等

在这里插入图片描述

九、 进入到安装向导的第三步,填写好您的网站信息

在这里插入图片描述

十、搭建好之后就可以进入网校系统的web界面

在这里插入图片描述

十一、华为云点播VOD

华为云点播是集视频上传、自动化转码处理、媒体资源管理、分发加速、视频播放于一体的一站式媒体服务。借助华为云提供灵活弹性解决方案,您无需关注服务依赖的底层基础设施,只需要依托高质量的媒体处理服务来快速搭建安全、弹性的点播平台。

选购华为云点播CDN流量包

在这里插入图片描述

十二、在后台配置个人的华为云视频账号信息 HUAWEICLOUD_SDK_AK和 HUAWEICLOUD_SDK_SK

VideoInfo.php的代码展示

<?php

namespace HuaweiCloud\SDK\Vod\V1\Model;

use \ArrayAccess;
use HuaweiCloud\SDK\Core\Utils\ObjectSerializer;
use HuaweiCloud\SDK\Core\Utils\ModelInterface;
use HuaweiCloud\SDK\Core\SdkResponse;

class VideoInfo implements ModelInterface, ArrayAccess
{
    const DISCRIMINATOR = null;

    /**
    * The original name of the model.
    *
    * @var string
    */
    protected static $openAPIModelName = 'VideoInfo';

    /**
    * Array of property to type mappings. Used for (de)serialization
    * quality  画质<br/> 4K默认分辨率3840*2160,码率8000kbit/s<br/> 2K默认分辨率2560*1440,码率7000kbit/s<br/> FULL_HD默认分辨率1920*1080,码率3000kbit/s<br/> HD默认分辨率1280*720,码率1000kbit/s<br/> SD默认分辨率854*480,码率600kbit/s<br/> FLUENT默认分辨率480*270,码率300kbit/s<br/>
    * width  视频宽度<br/>
    * height  视频高度<br/>
    * bitrate  码率,单位:kbit/s<br/>
    * frameRate  帧率(默认为0,0代表自适应,单位是帧每秒)<br/>
    *
    * @var string[]
    */
    protected static $openAPITypes = [
            'quality' => 'string',
            'width' => 'int',
            'height' => 'int',
            'bitrate' => 'int',
            'frameRate' => 'int'
    ];

    /**
    * Array of property to format mappings. Used for (de)serialization
    * quality  画质<br/> 4K默认分辨率3840*2160,码率8000kbit/s<br/> 2K默认分辨率2560*1440,码率7000kbit/s<br/> FULL_HD默认分辨率1920*1080,码率3000kbit/s<br/> HD默认分辨率1280*720,码率1000kbit/s<br/> SD默认分辨率854*480,码率600kbit/s<br/> FLUENT默认分辨率480*270,码率300kbit/s<br/>
    * width  视频宽度<br/>
    * height  视频高度<br/>
    * bitrate  码率,单位:kbit/s<br/>
    * frameRate  帧率(默认为0,0代表自适应,单位是帧每秒)<br/>
    *
    * @var string[]
    */
    protected static $openAPIFormats = [
        'quality' => null,
        'width' => null,
        'height' => null,
        'bitrate' => null,
        'frameRate' => null
    ];

    /**
    * Array of property to type mappings. Used for (de)serialization
    *
    * @return array
    */
    public static function openAPITypes()
    {
        return self::$openAPITypes;
    }

    /**
    * Array of property to format mappings. Used for (de)serialization
    *
    * @return array
    */
    public static function openAPIFormats()
    {
        return self::$openAPIFormats;
    }

    /**
    * Array of attributes where the key is the local name,
    * and the value is the original name
    * quality  画质<br/> 4K默认分辨率3840*2160,码率8000kbit/s<br/> 2K默认分辨率2560*1440,码率7000kbit/s<br/> FULL_HD默认分辨率1920*1080,码率3000kbit/s<br/> HD默认分辨率1280*720,码率1000kbit/s<br/> SD默认分辨率854*480,码率600kbit/s<br/> FLUENT默认分辨率480*270,码率300kbit/s<br/>
    * width  视频宽度<br/>
    * height  视频高度<br/>
    * bitrate  码率,单位:kbit/s<br/>
    * frameRate  帧率(默认为0,0代表自适应,单位是帧每秒)<br/>
    *
    * @var string[]
    */
    protected static $attributeMap = [
            'quality' => 'quality',
            'width' => 'width',
            'height' => 'height',
            'bitrate' => 'bitrate',
            'frameRate' => 'frame_rate'
    ];

    /**
    * Array of attributes to setter functions (for deserialization of responses)
    * quality  画质<br/> 4K默认分辨率3840*2160,码率8000kbit/s<br/> 2K默认分辨率2560*1440,码率7000kbit/s<br/> FULL_HD默认分辨率1920*1080,码率3000kbit/s<br/> HD默认分辨率1280*720,码率1000kbit/s<br/> SD默认分辨率854*480,码率600kbit/s<br/> FLUENT默认分辨率480*270,码率300kbit/s<br/>
    * width  视频宽度<br/>
    * height  视频高度<br/>
    * bitrate  码率,单位:kbit/s<br/>
    * frameRate  帧率(默认为0,0代表自适应,单位是帧每秒)<br/>
    *
    * @var string[]
    */
    protected static $setters = [
            'quality' => 'setQuality',
            'width' => 'setWidth',
            'height' => 'setHeight',
            'bitrate' => 'setBitrate',
            'frameRate' => 'setFrameRate'
    ];

    /**
    * Array of attributes to getter functions (for serialization of requests)
    * quality  画质<br/> 4K默认分辨率3840*2160,码率8000kbit/s<br/> 2K默认分辨率2560*1440,码率7000kbit/s<br/> FULL_HD默认分辨率1920*1080,码率3000kbit/s<br/> HD默认分辨率1280*720,码率1000kbit/s<br/> SD默认分辨率854*480,码率600kbit/s<br/> FLUENT默认分辨率480*270,码率300kbit/s<br/>
    * width  视频宽度<br/>
    * height  视频高度<br/>
    * bitrate  码率,单位:kbit/s<br/>
    * frameRate  帧率(默认为0,0代表自适应,单位是帧每秒)<br/>
    *
    * @var string[]
    */
    protected static $getters = [
            'quality' => 'getQuality',
            'width' => 'getWidth',
            'height' => 'getHeight',
            'bitrate' => 'getBitrate',
            'frameRate' => 'getFrameRate'
    ];

    /**
    * Array of attributes where the key is the local name,
    * and the value is the original name
    *
    * @return array
    */
    public static function attributeMap()
    {
        return self::$attributeMap;
    }

    /**
    * Array of attributes to setter functions (for deserialization of responses)
    *
    * @return array
    */
    public static function setters()
    {
        return self::$setters;
    }

    /**
    * Array of attributes to getter functions (for serialization of requests)
    *
    * @return array
    */
    public static function getters()
    {
        return self::$getters;
    }

    /**
    * The original name of the model.
    *
    * @return string
    */
    public function getModelName()
    {
        return self::$openAPIModelName;
    }
    const QUALITY_FULL_HD = 'FULL_HD';
    const QUALITY_HD = 'HD';
    const QUALITY_SD = 'SD';
    const QUALITY_FLUENT = 'FLUENT';
    const QUALITY__2_K = '2K';
    const QUALITY__4_K = '4K';
    const QUALITY_UNKNOW = 'UNKNOW';
    

    /**
    * Gets allowable values of the enum
    *
    * @return string[]
    */
    public function getQualityAllowableValues()
    {
        return [
            self::QUALITY_FULL_HD,
            self::QUALITY_HD,
            self::QUALITY_SD,
            self::QUALITY_FLUENT,
            self::QUALITY__2_K,
            self::QUALITY__4_K,
            self::QUALITY_UNKNOW,
        ];
    }


    /**
    * Associative array for storing property values
    *
    * @var mixed[]
    */
    protected $container = [];

    /**
    * Constructor
    *
    * @param mixed[] $data Associated array of property values
    *                      initializing the model
    */
    public function __construct(array $data = null)
    {
        $this->container['quality'] = isset($data['quality']) ? $data['quality'] : null;
        $this->container['width'] = isset($data['width']) ? $data['width'] : null;
        $this->container['height'] = isset($data['height']) ? $data['height'] : null;
        $this->container['bitrate'] = isset($data['bitrate']) ? $data['bitrate'] : null;
        $this->container['frameRate'] = isset($data['frameRate']) ? $data['frameRate'] : null;
    }

    /**
    * Show all the invalid properties with reasons.
    *
    * @return array invalid properties with reasons
    */
    public function listInvalidProperties()
    {
        $invalidProperties = [];
        if ($this->container['quality'] === null) {
            $invalidProperties[] = "'quality' can't be null";
        }
            $allowedValues = $this->getQualityAllowableValues();
                if (!is_null($this->container['quality']) && !in_array($this->container['quality'], $allowedValues, true)) {
                $invalidProperties[] = sprintf(
                "invalid value for 'quality', must be one of '%s'",
                implode("', '", $allowedValues)
                );
            }

        if ($this->container['bitrate'] === null) {
            $invalidProperties[] = "'bitrate' can't be null";
        }
        if ($this->container['frameRate'] === null) {
            $invalidProperties[] = "'frameRate' can't be null";
        }
            if (($this->container['frameRate'] > 60)) {
                $invalidProperties[] = "invalid value for 'frameRate', must be smaller than or equal to 60.";
            }
            if (($this->container['frameRate'] < 0)) {
                $invalidProperties[] = "invalid value for 'frameRate', must be bigger than or equal to 0.";
            }
        return $invalidProperties;
    }

    /**
    * Validate all the properties in the model
    * return true if all passed
    *
    * @return bool True if all properties are valid
    */
    public function valid()
    {
        return count($this->listInvalidProperties()) === 0;
    }

    /**
    * Gets quality
    *  画质<br/> 4K默认分辨率3840*2160,码率8000kbit/s<br/> 2K默认分辨率2560*1440,码率7000kbit/s<br/> FULL_HD默认分辨率1920*1080,码率3000kbit/s<br/> HD默认分辨率1280*720,码率1000kbit/s<br/> SD默认分辨率854*480,码率600kbit/s<br/> FLUENT默认分辨率480*270,码率300kbit/s<br/>
    *
    * @return string
    */
    public function getQuality()
    {
        return $this->container['quality'];
    }

    /**
    * Sets quality
    *
    * @param string $quality 画质<br/> 4K默认分辨率3840*2160,码率8000kbit/s<br/> 2K默认分辨率2560*1440,码率7000kbit/s<br/> FULL_HD默认分辨率1920*1080,码率3000kbit/s<br/> HD默认分辨率1280*720,码率1000kbit/s<br/> SD默认分辨率854*480,码率600kbit/s<br/> FLUENT默认分辨率480*270,码率300kbit/s<br/>
    *
    * @return $this
    */
    public function setQuality($quality)
    {
        $this->container['quality'] = $quality;
        return $this;
    }

    /**
    * Gets width
    *  视频宽度<br/>
    *
    * @return int|null
    */
    public function getWidth()
    {
        return $this->container['width'];
    }

    /**
    * Sets width
    *
    * @param int|null $width 视频宽度<br/>
    *
    * @return $this
    */
    public function setWidth($width)
    {
        $this->container['width'] = $width;
        return $this;
    }

    /**
    * Gets height
    *  视频高度<br/>
    *
    * @return int|null
    */
    public function getHeight()
    {
        return $this->container['height'];
    }

    /**
    * Sets height
    *
    * @param int|null $height 视频高度<br/>
    *
    * @return $this
    */
    public function setHeight($height)
    {
        $this->container['height'] = $height;
        return $this;
    }

    /**
    * Gets bitrate
    *  码率,单位:kbit/s<br/>
    *
    * @return int
    */
    public function getBitrate()
    {
        return $this->container['bitrate'];
    }

    /**
    * Sets bitrate
    *
    * @param int $bitrate 码率,单位:kbit/s<br/>
    *
    * @return $this
    */
    public function setBitrate($bitrate)
    {
        $this->container['bitrate'] = $bitrate;
        return $this;
    }

    /**
    * Gets frameRate
    *  帧率(默认为0,0代表自适应,单位是帧每秒)<br/>
    *
    * @return int
    */
    public function getFrameRate()
    {
        return $this->container['frameRate'];
    }

    /**
    * Sets frameRate
    *
    * @param int $frameRate 帧率(默认为0,0代表自适应,单位是帧每秒)<br/>
    *
    * @return $this
    */
    public function setFrameRate($frameRate)
    {
        $this->container['frameRate'] = $frameRate;
        return $this;
    }

    /**
    * Returns true if offset exists. False otherwise.
    *
    * @param integer $offset Offset
    *
    * @return boolean
    */
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }

    /**
    * Gets offset.
    *
    * @param integer $offset Offset
    *
    * @return mixed
    */
    public function offsetGet($offset)
    {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

    /**
    * Sets value based on offset.
    *
    * @param integer $offset Offset
    * @param mixed   $value  Value to be set
    *
    * @return void
    */
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
                $this->container[] = $value;
            } else {
                $this->container[$offset] = $value;
        }
    }

    /**
    * Unsets offset.
    *
    * @param integer $offset Offset
    *
    * @return void
    */
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    /**
    * Gets the string presentation of the object
    *
    * @return string
    */
    public function __toString()
    {
        return json_encode(
            ObjectSerializer::sanitizeForSerialization($this),
            JSON_PRETTY_PRINT
        );
    }
}

在这里插入图片描述12.1 创建一个普通课程,进行测试一下效果

在这里插入图片描述12.2 开始创建课程
在这里插入图片描述
在这里插入图片描述12.3 添加课时

UploadAsset.php代码的展示

<?php

namespace HuaweiCloud\SDK\Vod\V1\Model;

use \ArrayAccess;
use HuaweiCloud\SDK\Core\Utils\ObjectSerializer;
use HuaweiCloud\SDK\Core\Utils\ModelInterface;
use HuaweiCloud\SDK\Core\SdkResponse;

class UploadAsset implements ModelInterface, ArrayAccess
{
    const DISCRIMINATOR = null;

    /**
    * The original name of the model.
    *
    * @var string
    */
    protected static $openAPIModelName = 'UploadAsset';

    /**
    * Array of property to type mappings. Used for (de)serialization
    * url  媒资所在url
    * assetId  新创建媒资的媒资id
    * errorCode  错误码。
    * errorMsg  错误描述。
    *
    * @var string[]
    */
    protected static $openAPITypes = [
            'url' => 'string',
            'assetId' => 'string',
            'errorCode' => 'string',
            'errorMsg' => 'string'
    ];

    /**
    * Array of property to format mappings. Used for (de)serialization
    * url  媒资所在url
    * assetId  新创建媒资的媒资id
    * errorCode  错误码。
    * errorMsg  错误描述。
    *
    * @var string[]
    */
    protected static $openAPIFormats = [
        'url' => null,
        'assetId' => null,
        'errorCode' => null,
        'errorMsg' => null
    ];

    /**
    * Array of property to type mappings. Used for (de)serialization
    *
    * @return array
    */
    public static function openAPITypes()
    {
        return self::$openAPITypes;
    }

    /**
    * Array of property to format mappings. Used for (de)serialization
    *
    * @return array
    */
    public static function openAPIFormats()
    {
        return self::$openAPIFormats;
    }

    /**
    * Array of attributes where the key is the local name,
    * and the value is the original name
    * url  媒资所在url
    * assetId  新创建媒资的媒资id
    * errorCode  错误码。
    * errorMsg  错误描述。
    *
    * @var string[]
    */
    protected static $attributeMap = [
            'url' => 'url',
            'assetId' => 'asset_id',
            'errorCode' => 'error_code',
            'errorMsg' => 'error_msg'
    ];

    /**
    * Array of attributes to setter functions (for deserialization of responses)
    * url  媒资所在url
    * assetId  新创建媒资的媒资id
    * errorCode  错误码。
    * errorMsg  错误描述。
    *
    * @var string[]
    */
    protected static $setters = [
            'url' => 'setUrl',
            'assetId' => 'setAssetId',
            'errorCode' => 'setErrorCode',
            'errorMsg' => 'setErrorMsg'
    ];

    /**
    * Array of attributes to getter functions (for serialization of requests)
    * url  媒资所在url
    * assetId  新创建媒资的媒资id
    * errorCode  错误码。
    * errorMsg  错误描述。
    *
    * @var string[]
    */
    protected static $getters = [
            'url' => 'getUrl',
            'assetId' => 'getAssetId',
            'errorCode' => 'getErrorCode',
            'errorMsg' => 'getErrorMsg'
    ];

    /**
    * Array of attributes where the key is the local name,
    * and the value is the original name
    *
    * @return array
    */
    public static function attributeMap()
    {
        return self::$attributeMap;
    }

    /**
    * Array of attributes to setter functions (for deserialization of responses)
    *
    * @return array
    */
    public static function setters()
    {
        return self::$setters;
    }

    /**
    * Array of attributes to getter functions (for serialization of requests)
    *
    * @return array
    */
    public static function getters()
    {
        return self::$getters;
    }

    /**
    * The original name of the model.
    *
    * @return string
    */
    public function getModelName()
    {
        return self::$openAPIModelName;
    }
    


    /**
    * Associative array for storing property values
    *
    * @var mixed[]
    */
    protected $container = [];

    /**
    * Constructor
    *
    * @param mixed[] $data Associated array of property values
    *                      initializing the model
    */
    public function __construct(array $data = null)
    {
        $this->container['url'] = isset($data['url']) ? $data['url'] : null;
        $this->container['assetId'] = isset($data['assetId']) ? $data['assetId'] : null;
        $this->container['errorCode'] = isset($data['errorCode']) ? $data['errorCode'] : null;
        $this->container['errorMsg'] = isset($data['errorMsg']) ? $data['errorMsg'] : null;
    }

    /**
    * Show all the invalid properties with reasons.
    *
    * @return array invalid properties with reasons
    */
    public function listInvalidProperties()
    {
        $invalidProperties = [];
        return $invalidProperties;
    }

    /**
    * Validate all the properties in the model
    * return true if all passed
    *
    * @return bool True if all properties are valid
    */
    public function valid()
    {
        return count($this->listInvalidProperties()) === 0;
    }

    /**
    * Gets url
    *  媒资所在url
    *
    * @return string|null
    */
    public function getUrl()
    {
        return $this->container['url'];
    }

    /**
    * Sets url
    *
    * @param string|null $url 媒资所在url
    *
    * @return $this
    */
    public function setUrl($url)
    {
        $this->container['url'] = $url;
        return $this;
    }

    /**
    * Gets assetId
    *  新创建媒资的媒资id
    *
    * @return string|null
    */
    public function getAssetId()
    {
        return $this->container['assetId'];
    }

    /**
    * Sets assetId
    *
    * @param string|null $assetId 新创建媒资的媒资id
    *
    * @return $this
    */
    public function setAssetId($assetId)
    {
        $this->container['assetId'] = $assetId;
        return $this;
    }

    /**
    * Gets errorCode
    *  错误码。
    *
    * @return string|null
    */
    public function getErrorCode()
    {
        return $this->container['errorCode'];
    }

    /**
    * Sets errorCode
    *
    * @param string|null $errorCode 错误码。
    *
    * @return $this
    */
    public function setErrorCode($errorCode)
    {
        $this->container['errorCode'] = $errorCode;
        return $this;
    }

    /**
    * Gets errorMsg
    *  错误描述。
    *
    * @return string|null
    */
    public function getErrorMsg()
    {
        return $this->container['errorMsg'];
    }

    /**
    * Sets errorMsg
    *
    * @param string|null $errorMsg 错误描述。
    *
    * @return $this
    */
    public function setErrorMsg($errorMsg)
    {
        $this->container['errorMsg'] = $errorMsg;
        return $this;
    }

    /**
    * Returns true if offset exists. False otherwise.
    *
    * @param integer $offset Offset
    *
    * @return boolean
    */
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }

    /**
    * Gets offset.
    *
    * @param integer $offset Offset
    *
    * @return mixed
    */
    public function offsetGet($offset)
    {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

    /**
    * Sets value based on offset.
    *
    * @param integer $offset Offset
    * @param mixed   $value  Value to be set
    *
    * @return void
    */
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
                $this->container[] = $value;
            } else {
                $this->container[$offset] = $value;
        }
    }

    /**
    * Unsets offset.
    *
    * @param integer $offset Offset
    *
    * @return void
    */
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }

    /**
    * Gets the string presentation of the object
    *
    * @return string
    */
    public function __toString()
    {
        return json_encode(
            ObjectSerializer::sanitizeForSerialization($this),
            JSON_PRETTY_PRINT
        );
    }
}

在这里插入图片描述

十三、测试播放效果

13.1 在网站上点击播放一个视频, 可以看到视频已经实现华为云CDN加速播放了(播放加载速度)在这里插入图片描述
13.2 手机端视频播放效果

在这里插入图片描述

十四、寄语:

系统维护与优化

  1. 定期备份数据

定期备份 MySQL 数据库和 EduSoho 的文件,以防数据丢失。
2. 更新系统和软件

定期更新操作系统和所有已安装的软件,以修复安全漏洞和性能问题。
3. 监控和优化性能

使用监控工具监控服务器的性能和资源使用情况,并根据需要进行优化。
4. 安全性设置

加强服务器的安全性,包括设置防火墙、使用 SSL 证书、限制远程访问等。

通过以上步骤,你可以在华为云Flexus云服务器X实例上成功安装和部署 EduSoho 网校系统,并对其进行有效的维护和优化。

在这里插入图片描述在性能方面,Flexus 云服务器 X 表现出色。它拥有强大的处理器和充足的内存,能够轻松应对各种复杂的业务场景。无论是高并发的在线教育、视频播放、电商直播,还是大规模的数据处理,它都能快速响应,确保业务的顺畅运行。
🚀大家赶紧去选购吧!!!!!🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「C++系列」命名空间

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、命名空间1. 定义命名空间2. 使用命名空间中的成员3. 命名空间的…

SAP 利润分配-未分配利润的年初余额和年末余额不一致的问题

SAP OB53 本年利润科目的年初余额和年末余额不一致的问题 关于OB53科目的问题 OB53维护的本年利润科目 现象&#xff1a;为何去年年末的本年利润金额和今年年初的本年利润金额不一致。 解释原因&#xff1a; 本年利润科目的这种现象归根结底是“表结法”产生的&#xff0c;换…

QT----Creater14.0,qt5.15无法启动调试,Launching GDB Debugger报红

问题描述 使用QT Creater 14.0 和qt5.15,无法启动调试也没有报错,加载debugger报红 相关文件都有 解决方案 尝试重装QT,更换版本5.15.2,下载到文件夹,shift鼠标右键打开powershell输入 .\qt-online-installer-windows-x64-4.8.0.exe --mirror http://mirrors.ustc.edu.cn…

VMware 虚拟机配置固定 IP

1. VMware 配置 参考&#xff1a;https://blog.csdn.net/jsryin/article/details/123304582 参考&#xff1a;https://zhuanlan.zhihu.com/p/455097916 1.1. 点击编辑 -> 虚拟网络编辑器 1.2. Net 设置 选择VMnet8 进行配置 查看当前虚拟机的网关是192.168.17.2&#x…

HAproxy-7层负载均衡集群根据不同服务请求分配服务器

搭建HAproxy----7层负载均衡集群的补充 https://blog.csdn.net/qq_73990369/article/details/142500451?spm1001.2014.3001.5501 一、再准备两台虚拟机进行测试 192.168.229.15/24 ----php1 192.168.229.16/24 ----php2 1、PHP1 & php2(192.168.229.15/24 ,192…

做网站建设公司为客户着想方面

作为一家专业的网站建设公司&#xff0c;我们始终将客户的需求置于首位&#xff0c;致力于为客户打造独具特色、功能强大的网站&#xff0c;助力他们在激烈的市场竞争中脱颖而出。 专业团队&#xff0c;定制化服务 我们的团队由技术精湛、经验丰富的专业人才组成&#xff0c;能…

【笔记】光的衍射

一、 衍射现象 波遇到障碍物时&#xff0c;绕过障碍物 进入几何阴影区。 光偏离直线传播路径进入几何 阴影区&#xff0c;并形成光强非均匀稳 定分布。 二、菲涅耳原理 1、 惠更斯原理 波面上的每一点均为发 射子波的波源&#xff0c;这些子波的 包络面即新的波阵面 成功…

C++ 二叉树

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;他或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; ①若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 ②若它的右子树不为空&#xff0c;则右子树上所有节…

VIVADO IP核之FIR抽取器多相滤波仿真

VIVADO IP核之FIR抽取器多相滤波仿真&#xff08;含有与MATLAB仿真数据的对比&#xff09; 目录 前言 一、滤波器系数生成 二、用MATLAB生成仿真数据 三、VIVADO FIR抽取多相滤波器使用 四、VIVADO FIR抽取多相滤波器仿真 五、VIVADO工程下载 总结 前言 关于FIR低通滤波…

MySQL数据库修改authentication_string字段为显示密码后无法登录

MySQL数据库修改authentication_string字段为显示密码后无法登录 1. 本文创作背景2. 问题3. 原因分析4. 解决方案5. 附录 1. 本文创作背景 本文介绍MySQL数据库修改authentication_string字段为显示密码后无法登录的处理办法。 2. 问题 用户通过navicat修改MySQL的user表roo…

逆概率加权(R和Python案例)

逆概率加权&#xff08;Inverse Probability Weighting, IPW&#xff09;是一种统计技术&#xff0c;用于观察性研究中调整混杂变量的影响&#xff0c;以便更准确地估计因果关系。这种方法特别有用于在无法进行随机化实验的情况下&#xff0c;通过给予不同个体不同的权重&#…

[数据库实验七]事务设计

目录 一、实验目的与要求 二、实验内容 三、实验小结 实验中涉及的数据参考&#xff1a;[数据库实验一]数据库和表-CSDN博客 一、实验目的与要求 1.熟悉提交事务 2.回滚事务 3.检查点技术 注&#xff1a;可以用可视化软件来实现 二、实验内容 基于现有数据库设计事务提…

Axure-本地发布,局域网内用户访问

目录 前言内容一. 选择Axure发布路径&#xff0c;进行相应配置二.添加IIS服务配置&#xff08;不在这里赘述&#xff01;&#xff09;三&#xff1a;添加IIS配置&#xff0c;创建网站四.添加安全策略&#xff1a;实践&#xff1a; 前言 最近加入了公司的积分系统&#xff0c;由…

时尚与科技的融合,戴上更轻更悦耳的QCY C30耳夹耳机,随时享受好音乐

不知不觉&#xff0c;蓝牙耳机已经成了我日常必备的小工具了&#xff0c;尤其是这两年新出现的耳夹式耳机&#xff0c;轻松解决了入耳式耳机的舒适性难题&#xff0c;戴上一整天也不会觉得累&#xff0c;而且一款好看的耳机不仅能够提供澎湃的音质&#xff0c;还能成为时尚出街…

理解信息安全中的SOAR

在信息安全领域&#xff0c;SOAR&#xff08;Security Orchestration, Automation, and Response&#xff0c;安全编排、自动化与响应&#xff09;是一个现代化的解决方案&#xff0c;旨在通过集成和自动化的方式优化安全操作流程&#xff0c;提升威胁检测、事件响应的速度与效…

雷达原理-绪论-西电魏青

Radar 雷达&#xff1a;radio detection and ranging 无线电探测和测距 无线电&#xff1a;电磁波信号 探测&#xff1a;通过电磁波信号的一个回波特性实现物体探测 测距&#xff1a;利用回波信号&#xff08;现在技术发展&#xff0c;不单单是测距&#xff0c;还能是物体的各种…

stm32 flash无法擦除

通过bushound调试代码发现&#xff0c;当上位机发送命令到模组后flash将不能擦除&#xff0c;通过 HAL_FLASH_GetError&#xff08;&#xff09;函数查找原因是FLASH Programming Sequence error&#xff08;编程顺序错误&#xff09;&#xff0c;解决办法是在解锁后清零标志位…

构建高效房屋租赁系统:Spring Boot应用

1 绪论 1.1 研究背景 中国的科技的不断进步&#xff0c;计算机发展也慢慢的越来越成熟&#xff0c;人们对计算机也是越来越更加的依赖&#xff0c;科研、教育慢慢用于计算机进行管理。从第一台计算机的产生&#xff0c;到现在计算机已经发展到我们无法想象。给我们的生活改变很…

MySQL purge逻辑分析与调测

目录 purge逻辑分析与调测 一、purge线程 1、什么是purge线程&#xff1f; 2、为什么需要purge&#xff1f; 3、purge哪些内容&#xff1f; 4、什么时候purge&#xff1f; 5、purge内存结构 二、purge主要步骤 1、确认可见性 2、获取需要purge的undo记录 …

开源鸿蒙OpenHarmony系统修改屏幕旋转方法 深圳触觉智能RK3566开发板

本文提供OpenHarmony4.0系统竖屏修改为旋转时的操作方法&#xff0c;在此为大家介绍了两种方法&#xff01;第一种方式是将修改过的文件重新编译后烧录至开发板中实现屏幕旋转&#xff0c;第二种方式则是通过覆盖原文件的方式实现屏幕旋转。 1、源码下载 首先进入触觉智能官网…