I have a PIC reliably reading 10 fan tachometers while it is doing other things. Something to keep in mind is that if your input signal is at all noisy, a simple period measurement may not result in a stable reading, since noise can easily affect a single reading. It is best to take a an average over a period.

My method involves running a timer interrupt with a period shorter than the shortest expected "high" or "low" tachometer time. The interrupt service routine reads the port bits, and XORs them with the last reading of those bits. If the bit has changed, a counter is incremented. There is one counter for each fan to be monitored. The interrupt service routine keeps track of how many times it has run, so after a period of time (say a quarter or a half-second) it stores the individual counts. Simply multiplying the number of counts by a fixed value yields the RPM.

The ISR is written in assembly, but this approach has several advantages:

It doesn't require any external hardware
It averages the counts over a short period, so the readings are stable even in the presence of noise.
It works when the duty cycle is far from 50%.
It runs in the background, so you can process other tasks at the same time.

If you choose this approach, I can send you the code.