当前位置: 首页 > 编程日记 > 正文

异步预热在线视频实现

转载自https://blog.zymlinux.net/index.php/archives/100

毕业之际给学校搭建了基于ATS的正向代理缓存服务器,专门用来处理优酷土豆等在线视频流量。通过改写一个浏览器做成在线视频专用浏览器,内置了ATS的代理设置。

用php配合memcacheq和小脚本实现了简单的异步预热功能,在实际运用中安全性请自行考虑完善。

工作方式:PHP页面提交URL——>memcacheq<——shell脚本cron定时取队列url预热(wget)

php提交

php

PHP代码(海洋之心指导修改了部分):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<head>
<title>广师ATS缓存预热后台</title>
</head>
<?php
header("Content-type: text/html; charset=utf-8");
$myurl=$_GET['url'];
if(${myurl}!=""){
echo "${myurl}已经提交到下载队列,服务器会尽快下载";}
echo "";
echo "<form name=\"Form\" method=\"post\" action=\"mem.php\">";
echo "请输入要预热的视频URL:<input style=\"height:30px\" type=\"text\" name=\"url\" size=\"100\"/>";
     echo "<input style=\"height:30px\" type=\"submit\" value=\"提交\" />";
     echo "</form>";
?>

mem.php:

1
2
3
4
5
6
7
8
9
10
11
<?php
header("Content-type: text/html; charset=utf-8");
$url= $_POST['url'];
//if(${url}!=""){
$memcache_obj = memcache_connect('127.0.0.1', 21201);
memcache_set($memcache_obj, 'url', $url, 0, 80);
Header("Location: autofetch.php?url=$url");//}
//Header("Location: autofetch.php");
?>

memcacheq的配置参考:http://blog.163.com/song_0803/blog/static/46097597201131510533947/

Shell脚本:

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
46
47
48
49
50
51
52
53
54
55
#!/bin/bash
jinchengshu=`ps aux |grep -c "wget"`
if [ $jinchengshu -gt "3" ]; then
echo "wget进程太多,我先退出了"
exit 0
fi
shumu=1
time=`date "+%Y-%m-%d %H:%M:%S"`
memurl=`printf "get url\r\n" | nc 127.0.0.1 21201 | sed -n 2p`
ok=`echo $memurl | grep http`
if [ -z $ok ]
then
    echo "队列为空!"
    exit 0
else
echo "正在联网查询,请稍后..."
flvurl=`echo "$memurl" | sed -e "s@:@%3A@g" -e "s@/@%2F@g"`
echo "${time}要处理的URL为 $memurl" >>/data/ats/autofetch.log
url="http://www.flvcd.com/parse.php?format=&kw=${flvurl}"
urls=`curl -s "$url" |sed -r '/<a href="http:\/\/f.youku.com\/player/s/<a href="([^"]*)(.*)/\1/'
for u in $urls
do
    echo "找到的视频链接${shumu} $u" >>/data/ats/autofetch.log
    shumu=$((shumu + 1))
    trueurl=`curl -s -I $u | awk '/Location/{print $2}'`
    echo "真实视频URL $trueurl" >> /data/ats/autofetch.log
done
thead_num=15 ###并发数
tmp_fifo_file="/tmp/$$.fifo"
mkfifo $tmp_fifo_file
exec 6<>$tmp_fifo_file
rm -f $tmp_fifo_file
for ((i=0;i<$thead_num;i++))
do
        echo ""
done >&6
for i in $urls
do
        echo "URL为$i"
        read -u6
                {
                        nowtime=`date "+%Y-%m-%d %H:%M:%S"`
                        wget -Y on --header="Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" --header="Accept-Encoding:gzip, deflate" --header="Accept-Language:zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3" --header="Referer:http://static.youku.com/v1.0.0313/v/swf/loader.swf" --header="User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1" $i && echo "${nowtime} 下载完成 $i" >> /data/ats/autofetch.log
                        sleep 1
                        echo "" >&6
                }&
done
wait
exec 6>&-
echo " " >> /data/ats/autofetch.log
fi

【注:要配置wget的代理】

创建文件 ~/.wgetrc 内容为:http_proxy = http://atsip:端口/,然后可以设定crontab让shell脚本定时取memq队列预热。

喜欢用curl下载的话可以自行修改下wget的部分代码即可。

后话

经过上面的简单运用完善一下就可以出来了一个比较完整的预热功能如下图。

yure


相关文章:

文本输入框、密码输入框

当用户要在表单中键入字母、数字等内容时&#xff0c;就会用到文本输入框。文本框也可以转化为密码输入框。 语法&#xff1a; <form><input type"text/password" name"名称" value"文本" /> </form> 1、type&#xff1a; 当t…

Linux安装mysql,一步到位!

今天在腾讯云上面买了一个服务器&#xff0c;想要把自己的项目部署一下&#xff0c;就要安装mysql&#xff0c;以下是我的安装步骤,在网上有很多人把install敲错了&#xff0c;还有的少-get&#xff0c;种种错误试完之后&#xff0c;我决定发一篇 sudo apt-get install mysql-…

Ubuntu 12.04安装firefox 26中的flash plugin方法

Ubuntu 12.04 64bit中安装firefox 26中的flash player插件的方法昨天, 有最新的firefox 26更新了,可是我在软件更新中无法下载到ubuntu官方源中的flash plugin,详细的情况可以参见如下网页,这个问题我一年前也遇到过,特记录下来,以备后来查阅.http://blog.sina.com.cn/s/blog_9…

内联式css样式,直接写在现有的HTML标签中

CSS样式可以写在哪些地方呢&#xff1f;从CSS 样式代码插入的形式来看基本可以分为以下3种&#xff1a;内联式、嵌入式和外部式三种。这一小节先来讲解内联式。 内联式css样式表就是把css代码直接写在现有的HTML标签中&#xff0c;如下面代码&#xff1a; <p style"col…

Linux下安装Java8

Linux(ubuntu)下Java8安装 1.下载jdk8 这个看大家了&#xff0c;linux版本的就可以 2.创建jvm文件夹 在根目录下创建名为jvm的文件夹&#xff08;在哪里创建看个人&#xff09; $ sudo mkdir jvm3.将下载的包解压到jvm文件夹下 $ sudo tar zxvf 压缩包路径/名字 -C /jvm…

RTMFP协议

RTMFP是Adobe公司开发的一套新的通信协议&#xff0c;该协议可以让使用Adobe Flash Player的终端用户之间进行直接通信。用Adobe AIR框架开发的程序也可以用此协议来发布直播、实时信息。  通过使用RTMFP, 那些原来直播、实时通信的应用&#xff0c;比如社区、音视频聊天和多人…

CodeForces 595A

题目链接&#xff1a; http://codeforces.com/problemset/problem/595/A 题意&#xff1a; 一栋楼&#xff0c;有n层&#xff0c;每层有m户&#xff0c;每户有&#xff12;个窗户&#xff0c;问这栋楼还有多少户没有睡觉&#xff08;只要一个窗户灯亮就代表这户没有睡觉&#x…

将Eclipse中Web项目打成war包

将Eclipse中Web项目打成war包 请按如下操作即可&#xff1a;

测试代码发布到博客效果(Windows Live Writer发布)

测试代码发布到博客效果(Windows Live Writer发布) public class SwitchCase {/*** 1、switch后面的表达式为常量表达式,类型只能是可以转化为int、enum(1.6)、String(1.7)的类型* 2、可以转化为int类型的数据类型有&#xff1a;byte、short、int、char* 3、boolean类型的数据类…

设置腾讯云linux服务器中 MySQL 允许远程访问

申请了一台linux腾讯云服务器&#xff0c;想要把数据库搭建在上面&#xff0c;本地的Windows直接可以访问 以下就是具体的操作流程&#xff0c;首先你需要安装好一个mysql&#xff0c;安装方法–>mysql安装(Linux) 接着就开始操作咯&#xff1a; 一、开启 MySQL 远程访问权…

js 判断js,css是否引入,确保不重复引入

js 判断js,css是否引入&#xff0c;确保不重复引入 (2009-10-31 21:33:44) 转载▼标签&#xff1a; 杂谈 分类&#xff1a; js基本原理&#xff1a;function loadjscssfile(filename, filetype){if (filetype"js"){ //if filename is a external JavaScript filev…

Ubuntu18彻底删除MySQL5.7数据库

首先在终端中查看MySQL的依赖项&#xff1a;dpkg --list|grep mysql (有或者没有都可以继续执行) 移除所有mysql公共依赖&#xff1a;sudo apt-get remove mysql-common 卸载&#xff1a;sudo apt-get autoremove --purge mysql-server-5.7 清除残留数据&#xff1a;dpkg -…

软件缺陷处理流程

今天&#xff0c;我们的主任研究了一下我出的软件缺陷处理流程&#xff0c;觉得不严谨&#xff0c;他重新梳理了一个&#xff0c;偶还是觉得自己梳理的比较直接&#xff0c;没有那么复杂。 这里博客记录&#xff0c;用于纪念我的心血&#xff0c;因为说不定哪天偶的这点心血会被…

Linux下tomcat的安装与卸载以及配置(超简单)

无敌简单的几步 1、安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置2、卸载 rm -rf 你的tomcat目录3配置&#xff1a; 进入目录/tomcat/apache-tomcat-8.5.51/bin&#xff0c;编辑文件startup.sh&#xff0c;在…

《创业维艰分享之五》所有得,有所乐,日事日清,循序渐进。

这两个月公司连续做了两个大客户紧接着发布新版本再然后又是连续五个小版本迭代计划。 每天16小时的超强度工作&#xff0c;我已经看到兄弟的脸上都写着一个字&#xff1a;累&#xff01; 我自己又何尝不是&#xff0c;既是客服&#xff0c;又是程序员&#xff0c;还必须是行政…

docker上你必须会的那些命令

一、基础类 查看docker信息 # 查看docker版本 docker version # 显示docker系统的信息 docker info # 日志信息 docker logs # 故障检查 service docker status # 启动关闭docker sudo service docker start|stop二、容器操作命令 1、创建删除容器 # 创建一个容器命名为 te…

iOS开发UI篇—transframe属性(形变)

iOS开发UI篇—transframe属性&#xff08;形变&#xff09; 1. transform属性 在OC中&#xff0c;通过transform属性可以修改对象的平移、缩放比例和旋转角度 常用的创建transform结构体方法分两大类 &#xff08;1&#xff09; 创建“基于控件初始位置”的形变 CGAffineTransf…

docker一步安装mysql,docker的魅力就在于此

正常来说&#xff0c;使用docker安装东西的步骤是serach它有没有&#xff0c;然后pull它 这里其实只要一步&#xff08;如果你没有安装过、没有端口占用等问题的话&#xff01;&#xff01;&#xff09; $ docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORDroo…

python-day05正则表达式

相关参考文档地址:http://bbs.fishc.com/thread-57073-1-1.html&#xff08;小甲鱼论坛&#xff09; 摘录老师之精华 re模块用于对python的正则表达式的操作。 字符&#xff1a; . 匹配除换行符以外的任意字符  \w 匹配字母或数字或下划线或汉字  \s 匹配任意的空白符  \…

Vim编辑器的常用快捷键.

Linux中的文本操作离不开Vim编辑器的使用. Vim编辑器的使用相对门槛较高.需要挺长一段时间的适应. 总结一些Vim使用过程中常用的命令(这些命令基本上都是在vim的命令模式下使用) 1.跳转到文本的开头gg 2.跳转到文本的末尾G (shiftg) 3.查看文本的总共有多少行(:set nu) 关于这个…

在docker上安装部署tomcat项目 超简单,拿来主义

在docker中部署tomcat&#xff0c;非常简单&#xff0c;而且省去了手动安装jdk等步骤&#xff0c;只需要将war包复制在容器tomcat实例中的webapps下面即可。以下将详细讲解流程&#xff1a; 在windows中打好包以后用winSPC拖放到linux系统中&#xff0c;我的直接放在了/home/ub…

docker停止、删除容器、删除镜像 一看就理解

当你的容器中出现问题&#xff08;比如我改坏了文件&#xff09;需要重新部署一台的时候&#xff0c;就需要将这个容器实例删除 接着&#xff1a; #查看当前的容器ID $ docker ps这里你会看到有两列id&#xff0c;一列是镜像id&#xff0c;一列是容器id&#xff0c;我们要分清…

JavaScript对象掺杂点原型

我读完权威指南一部分的理解&#xff0c;对象和原型的关系&#xff1a;任何对象都可以充当原型 转载于:https://www.cnblogs.com/gaizaotuling/p/5553130.html

docker镜像的备份和恢复

在使用docker的时候总会出现这种情况&#xff1a;下载东西很慢很慢&#xff0c;下载完配置完以后&#xff0c;突然&#xff0c;一个地方配置出现了问题&#xff0c;无法恢复&#xff0c;需要重新装载&#xff0c;那么&#xff0c;之前的所有配置、安装、下载都没了&#xff0c;…

黑盒测试方法案例

1.根据下面给出的规格说明&#xff0c;利用等价类进行测试用例的设计。 一个程序读入3个正整数&#xff0c;把这三个数值看作一个三角形的3条边的长度值。这个程序要打印出信息&#xff0c;说明这个三角形是普通的、是等腰的、还是等边的。 a.找出输入输出条件&#xff0c;列出…

Dockerfile 入门看这篇就够了

在使用docker时&#xff0c;有很多像往容器中复制war包、修改容器配置之类的操作&#xff0c;很繁琐&#xff0c;配置失败或异常时就又是一遍重复的操作&#xff0c;这时候&#xff0c;就要用到这个脚本文件–Dockerfile 以下是我对Dockerfile的理解&#xff1a; 1、首先 Docke…

【DSP开发】C6000非多核非KeyStone系列DSP中断系统

C6000系列DSP的中断系统 上一篇介绍了C6455的GPIO系统&#xff0c;最后把GPIO4配置成了中断/事件模式&#xff0c;本文将介绍C6455的中断系统&#xff0c;介绍完基本概念后&#xff0c;给出把GPIO4映射到INT4的代码。 完成了GPIO和中断的配置&#xff0c;我们就可以开始着手DSP…

SVN用法大全,SVN除了update、commit还有什么

svn除了大家都知道的update、commit以外还有什么常用功能呢&#xff1f; 点击TortoiseSVN后&#xff0c;出现了右图的列表&#xff0c;这其中有哪些是常用的功能呢&#xff1f;最近在家办公&#xff0c;有些东西要svn操作&#xff0c;就了解了下。 咱们从上面开始 1、Show log…

递归删除目录下的所有文件

import java.io.File; public class DeleteDirectory { /** * 删除空目录 * param dir 将要删除的目录路径 */ private static void doDeleteEmptyDir(String dir) { boolean success (new File(dir)).delete(); if (success) { System.out.println("Successfully delete…

Web项目使用nginx实现代理端口访问,看这篇就够了

在搭建服务器的时候&#xff0c;项目部署在tomcat上&#xff0c;要访问项目&#xff0c;则需要加上端口号&#xff0c;如何隐藏端口号来访问呢&#xff0c;这就用到了nginx. nginx可以在docker上安装&#xff0c;也可以在linux上安装&#xff0c;这里我建议使用linux&#xff0…