• Stars
    star
    379
  • Rank 112,384 (Top 3 %)
  • Language
    PHP
  • Created over 14 years ago
  • Updated over 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A PHP class providing an easy interface for running multiple concurrent CURL requests

ParallelCurl


This module provides an easy-to-use interface to allow you to run multiple CURL url fetches in parallel in PHP.

Disclaimer

I've had reports of problems that appear to be related to changes in curl_multi's behavior. I'm no longer using PHP so I can't verify what's going wrong, but @marcushat has kindly provided a port with fixes: https://github.com/marcushat/rollingcurlx.

If you are hitting issues, please give it a try!
Pete Warden - Dec 16th 2014

Testing

To test it, go to the command line, cd to this folder and run

./test.php

This should run 100 searches through Google's API, printing the results. To see what sort of performance difference running parallel requests gets you, try altering the default of 10 requests running in parallel using the optional script argument, and timing how long each takes:

time ./test.php 1

time ./test.php 20

  • The first only allows one request to run at once, serializing the calls. I see this taking around 100 seconds.

  • The second run has 20 in flight at a time, and takes 11 seconds! Be warned though, it's possible to overwhelm your target if you fire too many requests at once. You may end up with your IP banned from accessing that server, or hit other API limits.

The class is designed to make it easy to run multiple curl requests in parallel, rather than waiting for each one to finish before starting the next. Under the hood it uses curl_multi_exec but since I find that interface painfully confusing, I wanted one that corresponded to the tasks that I wanted to run.

Usage

To use it, first copy parallelcurl.php and include it, then create the ParallelCurl object:

$parallelcurl = new ParallelCurl(10);

The first argument to the constructor is the maximum number of outstanding fetches to allow before blocking to wait for one to finish. You can change this later using setMaxRequests().

The second optional argument is an array of curl options in the format used by curl_setopt_array()

Next, start a URL fetch:

$parallelcurl->startRequest('http://example.com', 'on_request_done', array('something'));

The first argument is the address that should be fetched The second is the callback function that will be run once the request is done. The third is a 'cookie', that can contain arbitrary data to be passed to the callback.

This startRequest call will return immediately, as long as less than the maximum number of requests are outstanding. Once the request is done, the callback function will be called, eg:

on_request_done($content, 'http://example.com', $ch, array('something));

The callback should take four arguments. The first is a string containing the content found at the URL. The second is the original URL requested, the third is the curl handle of the request that can be queried to get the results, and the fourth is the arbitrary 'cookie' value that you associated with this object. This cookie contains user-defined data.

There's an optional fourth parameter to startRequest. If you pass in an array at that position in the arguments, the POST method will be used instead, with the contents of the array controlling the contents of the POST parameters.

Since you may have requests outstanding at the end of your script, you MUST call

$parallelcurl->finishAllRequests();

before you exit. If you don't, the final requests may be left unprocessed!

Credits

By Pete Warden [email protected], freely reusable, see http://petewarden.typepad.com for more

More Repositories

1

dstk

A collection of the best open data sets and open-source tools for data science
Ruby
1,125
star
2

iPhoneTracker

Objective-C
1,029
star
3

c_hashmap

A simple string hashmap in C
C
521
star
4

spchcat

Speech recognition tool to convert audio to text transcripts, for Linux and Raspberry Pi.
C
424
star
5

open-speech-recording

Web application to record speech for an open data set
HTML
417
star
6

dstkdata

The (large) data files needed for the Data Science Toolkit project
221
star
7

geodict

A simple Python library/tool for pulling location information from unstructured text
Python
184
star
8

findbyemail

A PHP module that incorporates all known APIs that map an email address to user information
PHP
108
star
9

openheatmap

A web renderer for geographic heat maps, using OpenStreetMap compatible file formats
C
102
star
10

extract_loudest_section

Trims .wav audio files to the loudest section of a given length
C++
94
star
11

buzzprofilecrawl

A simple script to crawl Google Profile pages and extract their information as structured data
PHP
90
star
12

tensorflow_makefile

C++
70
star
13

catdoc

Command-line utility for converting Microsoft Word documents to text
C
69
star
14

stm32_bare_lib

Simple examples and utilities for the STM32 "Blue Pill"
C
59
star
15

picoproto

Abominably Tiny Protobuf File Parser in C++
C++
54
star
16

ble_file_transfer

Example of transferring file data over BLE using an Arduino Nano Sense and WebBLE
C++
47
star
17

crunchcrawl

A project to gather, analyze and visualized the data in Crunchbase
PHP
46
star
18

salesforce_restphp_example

A minimal example showing how to handle the OAuth login process and make API calls using the Salesforce REST interface in PHP
PHP
42
star
19

pyparallelcurl

A simple Python class for running multiple URL fetches in parallel
Python
40
star
20

handmadeimap

An implementation of IMAP and POP3 in PHP using raw sockets rather than the php-imap extension
PHP
39
star
21

common_crawl_types

A simple Ruby example of how to process Common Crawl files using Elastic MapReduce
Ruby
30
star
22

pagerankgraph

Visualizes search engine ranking algorithms for a given domain
PHP
30
star
23

magic_wand

Magic Wand example for TensorFlow Lite Micro
Jupyter Notebook
28
star
24

genderfromname

A PHP port of the Perl Text::GenderFromName module
PHP
23
star
25

openwordcloud

Renders word clouds using HTML5's Canvas element
JavaScript
21
star
26

tensorflow_ios

C++
21
star
27

linkedinoauthexample

A minimal example showing how to handle the OAuth login process for LinkedIn using PHP
PHP
19
star
28

MLloWorld

Shows how to write a simple data contest entry for Kaggle, using scikit-learn for machine learning algorithms
Python
18
star
29

geoip_example

A simple example showing how to use the GeoIP API in PHP with the free database from http://maxmind.com
PHP
15
star
30

boilerpipe

A branch of the boilerpipe project
Java
15
star
31

arduino_nano_ble_write_flash

An example of modifying flash memory on the Arduino Nano BLE Sense 33 from a sketch, using Mbed.
C++
13
star
32

postgis2gmap

A small collection of PL/PGSQL functions for converting to and from Google's map tile coordinates
13
star
33

delicious_tags

A demonstration showing how to use the Delicious API to retrieve the top tags for a URL
PHP
12
star
34

simpledb_loader

A Java project exploring the fastest way to upload data to Amazon's SimpleDB
Java
10
star
35

hellosocialworld

A minimal but complete example of a site relying on authentication and sharing through Twitter and Facebook
Ruby
9
star
36

cruftstripper

Pulls strings that statistically look like valid sentences from unstructured text
Python
8
star
37

GeocodeFile

A PHP script to turn a file of addresses into latitude, longitude coordinates
PHP
8
star
38

cc2text

An example job that converts Common Crawl archived web pages into text
Ruby
7
star
39

memory_planner

Prototype for a memory planner for TensorFlow Lite Micro
C++
6
star
40

ml_memory_analyser

Runtime memory usage analysis utilities for ML models
Python
6
star
41

tf_ios_makefile_example

A simple iOS example showing how to use the iOS library produced by TensorFlow's makefile.
Objective-C++
6
star
42

twitteroauthexample

An example of how to implement the UI workflow for Twitter's oAuth process in PHP
PHP
6
star
43

flxjs

A javascript library emulating the Flex 3 Matrix, Point and Rectangle classes
JavaScript
6
star
44

schoolcrawl

Crawls the value-added school effectiveness data from the LA Times website
PHP
5
star
45

copyoptimizer

An example of using KissMetrics to measure and optimize your landing page copy
JavaScript
5
star
46

cuda-convnet

Python
4
star
47

stt_standalone_client

Copy of the example program from Coqui's open-source library with just the files needed to compile against a binary release.
C++
4
star
48

osm2pgsql

A fork of the importer for OpenStreetMap format files in PostGIS
C
4
star
49

invite_example

Sample code for the InvitesDoneRight service
PHP
4
star
50

stitchingbug

A demonstration of a polygon stitching problem with the HTML5 Canvas element
JavaScript
3
star
51

magic_wand_digit_data

Digit gesture training data for the Arduino BLE Nano Sense magic wand
3
star
52

pico_colabs

Colab notebooks for building Raspberry Pi Pico examples on the web
Jupyter Notebook
3
star
53

minimalprofiler

A super-simple profiler for Ruby
Ruby
3
star
54

geocodetest

Measures the quality of address to coordinate results across multiple services
Ruby
3
star
55

parec

Standalone version of the Pulse Audio pacat example
C
2
star
56

datathon

Support code for the ASA Datathon
Python
2
star
57

magic_wand_capture

C++
2
star
58

v4l2_opengl

Minimal example of using Video for Linux 2 together with OpenGL to display a live camera feed
C
2
star
59

pico_multicore_coherence_test

Minimal repro example for a memory coherence problem I encountered when running on the RP2040's dual cores
C
2
star
60

petesplugins

My old open-source video effects
2
star
61

cliargs_py

A utility module to make handling command line arguments in Python easier
Python
2
star
62

mbed-hello-world

Starter program for the mbed IDE for ARM M-class microcontrollers
C++
2
star
63

sinatraperftoolsexample

A minimal example of how to use Perftools in Sinatra
Ruby
2
star
64

cliargs

Easily get command-line arguments for PHP scripts, with error-checking and built-in usage help
2
star
65

tensorflow_apq8009

C++
1
star
66

invitesdoneright

1
star
67

BitBrain_C_Code

GitHub version of BitBrain code repository
C
1
star
68

bookiewatcher

Ruby script for analyzing the voting patterns on the bookie poll
Ruby
1
star
69

person_sensor_blues_web

Web frontend for the Blues/Person Sensor integration
Python
1
star
70

streaming_speech_metrics

Python library for analyzing the latency and accuracy of streaming speech to text systems
Python
1
star